如果x列中的值(字符串)重复,包括第一个实例,我试图找到一种删除行(制表符分隔表)的方法,但仅当列y和z之间的差异不是所有重复都是一样的。我知道这个命令会在第一个实例之后删除重复项:awk'!seen [$ 3] ++'filename,但我想要包含找到重复值的第一行。这是我想要做的一个例子:
x y z
a 10 20
b 15 25
b 15 30
b 10 20
c 15 20
d 20 30
e 10 20
e 15 25
e 5 15
f 30 40
会变成:
x y z
a 10 20
c 15 20
d 20 30
e 10 20
e 15 25
e 5 15
f 30 40
这里删除了列x中“b”的所有行,因为在该列中有多行“b”,因为y和z列中的值之间的差异对于这些行并不总是相同。第x列中带有“e”的行保持不变,因为y和z中的值之间的差异始终为10.
非常感谢任何帮助!
注意:我是awk的初学者
答案 0 :(得分:4)
awk
救援!
双通算法,标记和扫描
$ awk 'NR==FNR{if($1 in a) {if(a[$1]!=$3-$2) d[$1]}
else a[$1]=$3-$2; next}
!($1 in d)' file{,}
a 10 20
c 15 20
d 20 30
e 10 20
e 15 25
e 5 15
e 30 40
<强>解释强>
第一次扫描文件时 NR==FNR
if($1 in a)
如果已经看到第一个字段
if(a[$1]!=$3-$2)
但是delta与之前的
d[$1]
将该字段添加到删除列表
else a[$1]=$3-$2
如果以前没有看到该字段,请添加带字段的字段
next
进入下一条记录,直到完成所有行
我们现在正处于第二次扫描中
!($1 in d)
打印所有行,如果不在上面编译的删除列表中
file{,}
用于撰写file file
答案 1 :(得分:0)
使用GNU awk实现真正的多维数组:
$ awk 'NR==FNR{a[$1][$3-$2]; next} length(a[$1])==1' file file
x y z
a 10 20
c 15 20
d 20 30
e 10 20
e 15 25
e 5 15
f 30 40