使用awk根据在其他列

时间:2016-08-03 20:56:50

标签: bash awk

如果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的初学者

2 个答案:

答案 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

的bash简写

答案 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