2016-05-25 3 views
0

私は以下の出力結果のフォーマットに問題があります。awkの問題。複数のファイルに一度に行が重複しています。

多くのファイルに行が重複しています。SHORT_LIST.a SHORT_LIST.b SHORT_LIST.cですが、さらに多くのファイルが存在する可能性があります。

"sample1"という文字列と同様に、 "test1"という行が3つのファイルすべてに存在します。

"test"という行は2つのファイルに存在しますが、ファイルの中に複数存在しますので、ファイル名ごとにこの出力を1回だけ出力したいと思います。以下

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):以下のファイルで見つかったレコード(複数可)を複製します。次のファイルに重複したレコードがあります:テスト
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 file;ソートfile2.srtファイル2; comm -12 file.srt file2.srt> file1_2.comm; awk '{print "Dupes:" $ 0}' file1_2.comm'は "ホイールを再発明"するのではなく、標準的なツールを使うことができます。あなたはそれがあなたのために仕事をすることができるかどうかを判断するために 'comm'について読む時間を取る必要があります。がんばろう。 – shellter

+0

問題は、$ SITEFILESを介してあらかじめ決められたファイルを渡しています。開始時に大きなスクリプトに渡され、名前、日付、サイズなどで整理することができます。時々私は1つのファイルを持っているので、他の人は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は2回テストされます。これらのファイルの各行に対してジョブが開始されるため、各ファイルの重複をキャッチすることも重要です。それが意味をなさなければ? –

+1

あなたの「The Line」テストからの私の理解は、ファイル名ごとに1回出力されます。あなたはファイル内の重複を報告したくありませんか? – karakfa

1

はたぶん

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

のようなものは、それがよりこれに行うには実用的ではありません、あなたは小さなサンプルデータセットがなければ

を始めます。

IHTH

関連する問題