GNU/Linux >> Linux の 問題 >  >> Linux

1つのフィールドに重複する値があるCsvの連続する行を削除しますが、最後の行は保持しますか?

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


Linux
  1. 別のファイルにない1つのファイルの行を取得するためのツール?

  2. パターンに一致する連続する行のすべてのシーケンスの最初の行だけを保持しますか?

  3. 最後のログファイル(アルファベット順)を除く古いログファイルを削除しますか?

  1. 1行で最も古いファイルの年齢を検索しますか、それともゼロを返しますか?

  2. 重複、わずかな変更、テキストファイルの数行?

  3. sed を使用して Linux でテキスト ファイルの任意の行の最初の 5 文字を削除する

  1. xclipを使用してLinuxコマンドラインでコピーして貼り付けます

  2. Linux - 特定の行からファイルの最後までの grep

  3. コマンドラインで gz 圧縮ファイルの最後の行を出力するには?