2016-05-25 28 views
0

我在下面的格式輸出中遇到了問題。Awk問題,一次在多個文件中重複行。

我在許多文件中有重複的行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 

電流以下的輸出:

在以下文件中找到重複的記錄:

1)。在以下文件中找到重複結果:TEST1
SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c 樣品

2)。複製下面的文件中找到結果:測試
SHORT_LIST.c SHORT_LIST.b SHORT_LIST.b SHORT_LIST.b

3)。複製下面的文件中找到結果:/路徑/到/文件
SHORT_LIST.a SHORT_LIST.c 種皮

下面所需的輸出:在以下文件中找到

重複的記錄:

1)。在下面的文件中找到重複的結果:TEST1
SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c

2)。在下面的文件中找到重複的結果:樣品
SHORT_LIST.a SHORT_LIST.b SHORT_LIST.c

3)。在以下文件中找到重複記錄:test
SHORT_LIST.c SHORT_LIST.b

4)。複製下面的文件中找到結果:/路徑/到/文件
SHORT_LIST.a SHORT_LIST.c

5)。在以下文件中找到重複的記錄:testa SHORT_LIST.a SHORT_LIST.c

任何建議將不勝感激,我遇到了這個級別的AWK的麻煩。

+0

我不確定那將怎麼樣?我需要列出重複項以及它所在的每個文件。 –

+1

取下我原來的評論。也許像'sort -o file.srt文件;對file2.srt file2進行排序; comm -12 file.srt file2.srt> file1_2.comm; awk'{print「Dupes:」$ 0}'file1_2.comm'將允許您使用標準工具,而不是「重新發明輪子」;-)。您需要花時間閱讀'comm'來確定您是否能夠爲您輸出。祝你好運。 – shellter

+0

事情是,我通過$ SITEFILES傳遞預定的文件,它們在開始時被傳遞到一個更大的腳本中,並且可以按名稱,日期,大小等進行排列,所以我不能只給它一些文件名字,因爲有時我會有一個文件,在其他的我可能有5000個文件,這取決於先前的處理過程。 –

回答

0

我分裂出來的多個文件,並在同一個文件內,我也把東西在允許被忽略的意見,你可以用空白做太多,等

非常感謝@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 


    } 
2
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"; 
    } 

其中

$ head f{a,b,c} 
==> fa <== 
test 
test 
test1 
sample 
/path/to/file 

==> fb <== 
test 
test 
sample 

==> fc <== 
test 
sample 
/path/to/file 

PS。始終提供樣品輸入。

+0

哇哇謝謝,這是完美的! - 時間,任何想法如何我可以在同一個文件中找到愚蠢?或者我如何在文件名之間添加換行符?即「fa」\ n「fb」\ n「fc」 –

+0

即fb在那裏有兩次測試,對於這些文件中的每一行都會啓動一個作業,因此在每個文件中重複複製也很重要。如果那有意義的話? –

+1

我的理解來自您的「The line」測試「存在......每個文件名只輸出一次。」聲明是你不想在文件中報告重複。 – karakfa

1

也許像

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

將讓你開始

不小的樣本數據集,它不是實際的做多這一點。

IHTH

相關問題