
1行あたりのレコードのみを持つ大規模なcsvファイルで重複するIDを見つけようとしていますが、重複する項目を見つけるための条件が最初の列です。<id>,<value>,<date>
例.csv
11111111,high,6/3/2019
22222222,high,6/3/2019
33333333,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019
希望の出力:
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019
出力は順次である必要はありません。
答え1
AWKを使用:
awk -F, 'data[$1] && !output[$1] { print data[$1]; output[$1] = 1 }; output[$1]; { data[$1] = $0 }'
各行を見て、次のように動作します。
- 最初の列の値を見た場合は、その値と一致する行を出力し、記憶された行を出力する必要があります。
- 現在行の最初の列が出力しようとしている内容と一致すると、現在行が出力されます。
- 最初の列に入力された現在の行を保存します。
答え2
すべてのIDの長さが同じ場合(例では8文字)、sort
GNUを使用して完全な操作を実行できますuniq
。
$ sort file | uniq -Dw 8
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019
長さが異なる場合でも、この方法を使用できますが、少し複雑になります。
$ tr ',' ' ' < file | sort | rev | uniq -f2 -D | rev | tr ' ' ','
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019
答え3
awk -F, '$1 in m { print m[$1]$0; m[$1]=""; next }
{ m[$1]=$0 "\n" }' ex
答え4
GNU sed
これは、拡張正規表現構成を利用して行うことができます。まず、ファイルをパターンスペースにロードしてから、パターンスペースの先頭から重複していない行をすべて削除します。また、\n\n
繰り返し行を上書きするパターン空間の最後にフラグが配置されます。したがって、フラグがパターンスペースの先頭にバブリングされると、=>ジョブが終了し、パターンスペースからフラグを削除してstdoutとして印刷できるようになります。
$ sed -Ee '
$!{
N;s/^/\n/
$s/$/\n\n/;D
}
/^([^,\n]*),[^\n]*\n(.*\n)?\1,/!D
s/^([^\n]*)(.*)/\2\1\n/;/^\n\n/!D
s/^\n\n//;s/\n$//
' inp
ここにPOSIX-sed
問題を解決するバージョンとは異なる方法があります。つまり、スキーマや予約済みスペースのどの時点でもファイル全体を保持しません。重複ラインが表示されるとすぐに、標準出力として印刷され、参照ラインが表示され、印刷されます。次回重複行を見ると印刷したくないので表示されます。
$ sed -ne '
H;g;y/\n_/_\n/
/.*_\([^,_]*\)\(,[^_]*\)\[0]_\(.*_\)\{0,1\}\1,[^_]*$/{
s//\1\2/;y/_\n/\n_/;p
g;s/.*\n//p;g;y/\n_/_\n/
s/\(.*_\([^,_]*\),[^_]*\)\[0]\(_\(.*_\)\{0,1\}\)\2,[^_]*$/\1[1]\3/
s/_$//;y/_\n/\n_/;bh
}
/.*_\([^,_]*\)\(,[^_]*\)\[1]_\(.*_\)\{0,1\}\1,[^_]*$/{
s/.*_//;y/_\n/\n_/;p
g;s/\(.*\)\n.*/\1/;bh
}
y/_\n/\n_/;s/$/[0]/;:h;h
' inp
これはPerl
、配列ハッシュの行を維持する問題に対する基本的な解決策です。重複行が表示されている場合は、配列を印刷して空にしてから重複行を印刷します。
$ perl -F, -lane '
push(@{$h{$F[0]}},$_),next if ! exists $h{$F[0]};
print for splice(@{$h{$F[0]}}),$_;
' inp
出力:
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019