如何使用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真实条件下的默认行为是 to print,这就是为什么这里不需要它
  • 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]

相关内容