awkを使用して同じ列から同じ内容の行を削除する方法

awkを使用して同じ列から同じ内容の行を削除する方法

次のような大容量ファイルがあります。

H2,3,5,9,ef,ty,i;
H2,7,5,6,rt,hg,j;
T2,5,5,0,207,3.7,00,...,2023:46:18:14:31,76;
T2,5,5,0,207,3.5,00,...,2023:46:18:14:31,76;
T2,5,5,0,119,3.5,00,...,2023:46:18:14:32,10;
T2,5,5,0,207,3.5,00,...,2023:46:18:14:32,15;
T2,5,5,0,186,3.4,00,...,2023:46:18:14:32,16;
T2,5,5,0,207,4.6,00,...,2023:46:18:14:32,30;
....

次の行を削除する必要があります。

  1. T2,5,5,0,207から開始
  2. フィールド15に重複したタイムスタンプがあります。

他のすべての行は変更せずに残します。

いろいろな組み合わせを試してみましたが、これまでに確認した組み合わせのどれも機能しませんでした。

awk -F ',' ' x!=$15 { if ($1 == T2 && $5 == 207) {x=$15; print$0} else print$0} ' test > test1

どんなアドバイスも本当にありがとうございます!ありがとう

答え1

この試み:

$ awk -F, '!seen[$1,$2,$3,$4,$5,$8]++' file

出力

H2,3,5,9,ef,ty,i;
H2,7,5,6,rt,hg,j;
T2,5,5,0,207,3.7,00,...,2023:46:18:14:31,76;
T2,5,5,0,119,3.5,00,...,2023:46:18:14:32,10;
T2,5,5,0,186,3.4,00,...,2023:46:18:14:32,16;

説明する

  • awk実際の条件での基本的な動作は、ここではprint必要ありません。
  • これは!seen[x]++タスク実行の略語ですuniq。確認するここ

移植性

適用対象:

  • gawk
  • mawk
  • busybox awk
  • nawk(基本freeBSD awk

そして、すべてのawk実装、ありがとうエドモートン

記録された元のスニペット:

awk -F, '
     ($1=="T2" && $2==5 && $3==5 && $4==0 && $5==207 && !seen[$8]++) ||
    !($1=="T2" && $2==5 && $3==5 && $4==0 && $5==207)
' file

答え2

これはあなたが望むものですか?

$ awk -F, '/^T2,5,5,0,207,/ && seen[$15]++{ next }1' infile
H2,3,5,9,ef,ty,i;
H2,7,5,6,rt,hg,j;
T2,5,5,0,207,3.7,00,...,2023:46:18:14:31,76;
T2,5,5,0,119,3.5,00,...,2023:46:18:14:32,10;
T2,5,5,0,207,3.5,00,...,2023:46:18:14:32,15;
T2,5,5,0,186,3.4,00,...,2023:46:18:14:32,16;
....

最初の5つのフィールドとそのフィールド#15のタイムスタンプと一致する最初の行を印刷し、以前に示されたものとT2,5,5,0,207同じ5つの開始フィールドと同じタイムスタンプを持つ他の同様の行をスキップします。また、他のすべての行も無条件に印刷されます。 。

答え3

フィールドごとに重複項目を削除する必要があることに気づきました。

awk -F, '!(/^T2,5,5,0,207/ && A[$(NF-1)]++)' file
H2,3,5,9,ef,ty,i;
H2,7,5,6,rt,hg,j;
T2,5,5,0,207,3.7,00,...,2023:46:18:14:31,76;
T2,5,5,0,119,3.5,00,...,2023:46:18:14:32,10;
T2,5,5,0,207,3.5,00,...,2023:46:18:14:32,15;
T2,5,5,0,186,3.4,00,...,2023:46:18:14:32,16;

A[$(NF-1)]- このファイルにA[$9]

関連情報