2つの列を持つ長いCSVファイルがあります。これには、次のような連続した複製の実行が含まれます。
...
1500,1533
1554,1678
1554,1703
1554,1728
1593,1766
...
最後の重複を除いて、これらの重複をすべて削除する必要があります。したがって、上記の例の出力は次のようになります。
...
1500,1533
1554,1728
1593,1766
...
また、ファイル内の残りの行を元の順序で保持する必要があります。
tac file.csv | sort -k1,1 -r -u -t,
しかし、これでは望ましい結果が得られず、並べ替えベースの関数が行の順序を台無しにしました。
承認された回答:
sedを使用 :
sed '$!N;/\(.*,\).*\n\1/!P;D' infile
N パターンスペースとsedには常に2つの連続した行があることを意味します P その行の最初のフィールドが2番目の行の最初のフィールドと同じでない場合にのみ、最初のフィールドをリントします。次にD パターンスペースから最初の行を削除し、サイクルを再開します。
gnu datamashを使用した別の方法 (ファイルがdatamashとしてソートされていると仮定します ソートされた入力が必要です):
datamash -t ',' -g 1 last 2 <infile
このg ,をループします 1で区切られた入力 stフィールド、lastのみを出力 値(2から 各グループの第2列)。
ファイルが並べ替えられていない場合datamash -sで並べ替えることができます :
datamash -t ',' -s -g 1 last 2 <infile
ただし、これは、行の最初の順序が保持されないことを意味します。したがって、これはあなたが望むことをしないかもしれません。その場合、sedを使用できます / awk / perl など…