多くのファイルを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オプションに従って一意の行を使用して印刷しますか?-u
k1,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