次のような大容量ファイルがあります。
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;
....
次の行を削除する必要があります。
- T2,5,5,0,207から開始
- フィールド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]