Linux Awk问题,一次在多个文件中复制行。

Linux Awk问题,一次在多个文件中复制行。,linux,bash,awk,duplicates,printf,Linux,Bash,Awk,Duplicates,Printf,我对下面的输出格式有问题 我在很多文件SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c中都有重复的行,但是可以有很多很多 三个文件中都存在行“test1”,字符串“sample”也存在 行“test”存在于两个文件中,但在其中一个文件中存在不止一次,我希望每个文件名只输出一次 function check_duplicates { awk 'END { for (R in rec) { #split out the SHORT_LIST files

我对下面的输出格式有问题

我在很多文件SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c中都有重复的行,但是可以有很多很多

三个文件中都存在行“test1”,字符串“sample”也存在

行“test”存在于两个文件中,但在其中一个文件中存在不止一次,我希望每个文件名只输出一次

function check_duplicates {

 awk 'END {
   for (R in rec) {
   #split out the SHORT_LIST files
    n = split(rec[R], t, "/SHORT_LIST")
    #printf n dup[n]
    count = 0
if  ( n > 2 )
 dup[n] = dup[n] ? dup[n] RS sprintf( R, rec[R]) :
   sprintf("\t%-20s %s ", R, rec[R]);
}
for (D in dup) {
  ((count++))
   printf "%s\n \n", d
   printf count " ). Duplicate record(s) found in the following files: " dup[D]
     }
   }
{
   # build an array named rec (short for record), indexed by
   # the content of the current record ($0), concatenating
   # the filenames separated by / as values
   rec[$0] = rec[$0] ? rec[$0] "\n \t" FILENAME : FILENAME
   }' $SITEFILES

  }

check_duplicates
以下电流输出:

在以下文件中找到重复记录:

(一)。在以下文件中找到重复记录:test1
短名单 短名单 短名单 样品

(二)。在以下文件中发现重复记录:test
短名单 短名单 短名单 短名单

(三)。在以下文件中找到重复记录:/path/to/file
短名单 短名单 种皮

以下所需输出:

在以下文件中找到重复记录:

(一)。在以下文件中找到重复记录:test1
短名单 短名单 短名单

(二)。在以下文件中发现重复记录:示例
短名单 短名单 短名单

(三)。在以下文件中发现重复记录:test
短名单 短名单

(四)。在以下文件中找到重复记录:/path/to/file
短名单 短名单

(五)。在以下文件中找到重复记录:testa 短名单 短名单

如果您有任何建议,我将不胜感激,我对这个级别的AWK有困难

You can follow this template and fix the output format as desired

$ awk -f dups.awk fa fb fc

dups for : /path/to/file in files
fa fc
dups for : test in files
fa fb fc
dups for : sample in files
fa fb fc
no dups in
fc

$ cat dups.awk

  FNR==1{files[FILENAME]}
        {if((FILENAME, $0) in a) dupsInFile[FILENAME]
         else
           {a[FILENAME, $0]
            dups[$0] = $0 in dups ? (dups[$0] FS FILENAME) : FILENAME
            count[$0]++}}
     END{for(k in dups)
           {if(count[k] > 1)
              {print ("dups for : " k) " in files"
               print dups[k]}}
        for(f in dupsInFile) delete files[f];
        print "no dups in";
        for(f in files) printf "%s", f FS;
        printf "\n";
     }
在哪里

$headf{a,b,c}
==>fa-fb-fc
在哪里

$headf{a,b,c}
==>fa fb fc可能类似

 awk '{print FILENAME "\t" $0}' $SITEFILES \
 | sort \
 | uniq -c -f1 \
 | awk "{if ($1 + .0 != 1) print $0}'
会让你开始的

如果没有小样本数据集,在这方面做更多的工作是不现实的

也许是这样的

 awk '{print FILENAME "\t" $0}' $SITEFILES \
 | sort \
 | uniq -c -f1 \
 | awk "{if ($1 + .0 != 1) print $0}'
会让你开始的

如果没有小样本数据集,在这方面做更多的工作是不现实的


IHTH

我将其分为多个文件,在同一个文件中,我还添加了一些内容,以允许忽略注释,您也可以使用空白等

非常感谢@karakfa,你的回答太棒了,谢谢

function check_duplicates {
 #Check multiple files for duplicates.   
  awk '
   FNR==1{files[FILENAME]}
          {if((FILENAME, $0) in a) dupsInFile[FILENAME]
           else
             {a[FILENAME, $0]
              dups[$0] = $0 in dups ? (dups[$0] RS FILENAME) : FILENAME
              count[$0]++}}
              #ignore comment lines
               {if ($0 ~ /#/) {
                   delete dups[$0]
                }}
  #Print duplicates in more than one file
          END{for(k in dups)
             {if(count[k] > 1)
               {print ("\n\n\tDuplicate line found: " k) "\n\tIn the following file(s)"
                 print dups[k] }}
          printf "\n";


       }' $SITEFILES
 #Check single files for duplicates.    
 awk '
 NR {
     b[$0]++
    }
    #ignore comment lines
        $0 in b {
           if ($0 ~ /#/) {
           delete b[$0]
                         }
                      if (b[$0]>1) {
                      print ("\n\n\tDuplicate line found: "$0) "\n\tIn the following file"
                      print FILENAME
                      delete b[$0]
                      }
    }' $SITEFILES


  }

我把它分为多个文件,在同一个文件中,我还加入了一些东西,以允许忽略注释,你也可以用空白来做这件事,等等

非常感谢@karakfa,你的回答太棒了,谢谢

function check_duplicates {
 #Check multiple files for duplicates.   
  awk '
   FNR==1{files[FILENAME]}
          {if((FILENAME, $0) in a) dupsInFile[FILENAME]
           else
             {a[FILENAME, $0]
              dups[$0] = $0 in dups ? (dups[$0] RS FILENAME) : FILENAME
              count[$0]++}}
              #ignore comment lines
               {if ($0 ~ /#/) {
                   delete dups[$0]
                }}
  #Print duplicates in more than one file
          END{for(k in dups)
             {if(count[k] > 1)
               {print ("\n\n\tDuplicate line found: " k) "\n\tIn the following file(s)"
                 print dups[k] }}
          printf "\n";


       }' $SITEFILES
 #Check single files for duplicates.    
 awk '
 NR {
     b[$0]++
    }
    #ignore comment lines
        $0 in b {
           if ($0 ~ /#/) {
           delete b[$0]
                         }
                      if (b[$0]>1) {
                      print ("\n\n\tDuplicate line found: "$0) "\n\tIn the following file"
                      print FILENAME
                      delete b[$0]
                      }
    }' $SITEFILES


  }

我不知道这有什么用?我需要列出副本和它所在的每个文件。记下我的原始评论。可能类似于
sort-o file.srt文件;排序文件2.srt文件2;comm-12 file.srt file2.srt>file1_2.comm;awk{print“dups:$0}文件1_2.comm将允许您使用标准工具,而不是“重新发明轮子”;-)。您必须花时间阅读
comm
,以确定是否可以让它的输出为您服务。祝你好运。问题是,我正在通过$SITEFILES传递预先确定的文件,它们在开始时被传递到一个更大的脚本中,并且可以按名称、日期、大小等进行排列。所以我不能只给它一些文件名,因为有时我会有一个文件,有时我会有5000个,这取决于之前的处理过程。@ben,发布一些示例文件会使您更容易获得帮助。但我不确定这会有什么帮助?我需要列出副本和它所在的每个文件。记下我的原始评论。可能类似于
sort-o file.srt文件;排序文件2.srt文件2;comm-12 file.srt file2.srt>file1_2.comm;awk{print“dups:$0}文件1_2.comm将允许您使用标准工具,而不是“重新发明轮子”;-)。您必须花时间阅读
comm
,以确定是否可以让它的输出为您服务。祝你好运。问题是,我正在通过$SITEFILES传递预先确定的文件,它们在开始时被传递到一个更大的脚本中,并且可以按名称、日期、大小等进行排列。所以我不能只给它一些文件名,因为有时我会有一个文件,有时我会有5000个,这取决于之前的处理过程。@ben,发布一些示例文件将使您更容易获得帮助。哇,谢谢,这太完美了嗯,知道我怎么能在同一个文件里找到复制品吗?或者如何在文件名之间添加换行符?i、 e.“fa”\n“fb”\n“fc”即fb在其中有两次测试,对于这些文件中的每一行,都会启动一个作业,因此在每个文件中捕获重复项也很重要。如果这有意义的话?我从你的“行”测试中了解到“存在…每个文件名只输出一次。”声明是你不想在一个文件中报告重复项。哦,对不起,在翻译中丢失了,那么,我想a)在多个文件中报告重复项,B)在每个文件中报告重复项。我希望这是有道理的。另外,出于好奇,其中包含文件名的数组dups[k],您知道如何在每行打印这些元素吗?您的格式是单行:对于每个文件名的单独行:将“FS”替换为“RS”。对于同一文件中的重复项,可以使用dupsInFile array处理该部分,该部分将保留存在重复项的文件名。将条目存储在另一个按文件名索引的数组中,类似于dups数组。哇,谢谢,这太完美了嗯,知道我怎么能在同一个文件里找到复制品吗?或者如何在文件名之间添加换行符?i、 e.“fa”\n“fb”\n“fc”即fb在其中有两次测试,对于这些文件中的每一行,都会启动一个作业,因此在每个文件中捕获重复项也很重要。如果这有意义的话?我对你的“行”测试的理解是“存在…每个文件名只输出一次。”声明是你不想在一个文件中报告重复项。哦,对不起,在翻译中丢失了,我想a)在多个文件中报告重复项