次のような連続した重複エントリを含む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,
ただし、これは予想される結果を提供せず、ソートベースの機能は私の行の順序を混乱させます。
ベストアンサー1
そしてsed
:
sed '$!N;/\(.*,\).*\n\1/!P;D' infile
N
すなわち、パターン空間には常に2つの連続するラインがあり、sed
P
そのうちの第1のラインは、そのラインの第1のフィールドが第2のラインの第1のフィールドと異なる場合にのみ印刷される。次に、D
パターン空間から最初の行を削除し、ループを再開します。
別の方法はgnu datamash
(ファイルがdatamash
ソートされるべき入力に従ってソートされていると仮定):
datamash -t ',' -g 1 last 2 <infile
これにより、g
区切られた入力がstフィールドにグループ化され、各グループの値(nd列から)のみが印刷されます。,
1
last
2
ファイルがソートされていない場合は、次のdatamash
基準でソートできます-s
。
datamash -t ',' -s -g 1 last 2 <infile
ただし、これは行の初期順序が維持されないことを意味します。したがって、望ましい効果がないかもしれません。この場合、sed
//awk
などを使用できますperl
。