0

長さの異なる複数の 2 列のタブ区切りファイルがあり、すべてのファイルに共通する重複値を排除したいと考えています。

例えば:

ファイル 1:

9   1975
1518    a
5   a.m.
16  able
299 about
8   above
5   access

ファイル 2:

6   a
6   abandoned
140 abby
37  able
388 about
17  above
6   accident

ファイル 3:

5   10
8   99
23  1992
7   2002
29  237th
11  60s
8   77th
2175    a
5   a.m.
6   abandoned
32  able
370 about

ファイル 4:

5   911
1699    a
19  able
311 about
21  above
6   abuse

望ましい結果は、すべてのファイルに共通する列 2の項目をそれぞれのファイルから削除することです。望ましい結果は次のとおりです。

ファイル 1:

9   1975
5   a.m.
16  able
8   above
5   access

ファイル 2:

6   abandoned
140 abby
37  able
17  above
6   accident

ファイル 3:

5   10
8   99
23  1992
7   2002
29  237th
11  60s
8   77th
5   a.m.
6   abandoned
32  able

ファイル 4:

5   911
19  able
21  above
6   abuse

複数のファイルに重複している値を見つけようとしているため、重複する値を見つけるための標準的な方法のいくつかはこのタスクでは機能しません。したがって、commまたはのようなものsort/uniqは、このタスクには有効ではありません。awk目的の結果を得るために使用できる特定のタイプまたは別のタイプの再帰ツールはありますか?

4

2 に答える 2

2

ファイル内で $2 を複製できない場合は、次のような (未テスト) が機能します。

awk '
FNR==1 {
    if (seen[FILENAME]++) {
        firstPass = 0
        outfile = FILENAME "_new"
    }
    else {
        firstPass = 1
        numFiles++
        ARGV[ARGC++] = FILENAME
    }
}
firstPass { count[$2]++; next }
count[$2] != numFiles { print > outfile }
' file1 file2 file3 file4

ファイル内で $2 を複製できる場合は、各ファイルに最初に $2 が表示されたときにのみ count[$2] をインクリメントするように微調整します。

firstPass { if (!seen[FILENAME,$2]++) count[$2]++; next }
于 2015-02-20T14:07:01.733 に答える
-1

私はまだテストしていませんが、これでうまくいくはずです。これにより、「.new」拡張子のファイルが作成されます。

awk '{a[$2]++;b[$2]=$0;c[$2]=FILENAME}
      END{
          for(i in a){if(a[i]==1)print b[i]>c[i]".new"}
      }' file1 file2 file3 file4
于 2015-02-20T12:48:51.337 に答える