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
など…