awkを使用して47フィールドcsvファイルの列1から46から重複エントリを削除する方法は?

awkを使用して47フィールドcsvファイルの列1から46から重複エントリを削除する方法は?

多くのファイルをcsvファイルにマージするbashスクリプトがあります。 csvファイルには47個のフィールドと10000個の行があります。

しかし、私が使用した重複エントリを削除するために、ソートの目的awk '!seen[$0]++'で列47にソースソースへの参照を追加しました。

まだ1列から46列までのみインデックスを作成し、すべての列(47列を含む)を印刷したいと思います。

46をすべてリストする必要がありますかawk '!seen[$1, $2, $3, ,..etc.., $45, $46]++、それとも簡単な方法がありますか?

答え1

'sort_field=$47; $47=""; !seen[$0]++ { print $0 " " sort_field }' 

答え2

1〜46フィールドsortのuniqeオプションに従って一意の行を使用して印刷しますか?-uk1,46

sort -uk1,46 infile.txt

入力ファイルが.csvからカンマで区切られている場合は、.csvを使用して指定できます-t','

sort -t',' -uk1,46 infile.txt

たとえば、次の入力の場合:

1,2,3,4
5,6,7,8
1,2,3,x
a,b,c,d
5,6,7,y

出力は次のとおりです

1,2,3,4
5,6,7,8
a,b,c,d

答え3

この試み:

$ cat file
1 2 3 4
5 6 7 8
1 2 3 x
a b c d
5 6 7 y

最初の3つのフィールドを「キー」として扱い、2番目の「1 2 3」行と2番目の「5 6 7」行を削除しようとしています。

awk '
    {
        line = $0     # remember the original state of this line
        NF--          # forget about the last field
    }
    !seen[$0]++ {print line}   # if the "new" line is unique, print the "old" line
' file
1 2 3 4
5 6 7 8
a b c d

関連情報