我有一个看起来类似的大量文件:
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
真实条件下的默认行为是 toprint
,这就是为什么这里不需要它- the
!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;
....
打印第一行已经看到与T2,5,5,0,207
前五个字段的匹配以及其字段 #15 中的任何时间戳,然后跳过具有与之前看到的相同的五个起始字段和相同时间戳的其他类似行;它还将无条件打印所有其他行。
答案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]