两列的AWK脚本

时间:2016-03-30 07:28:32

标签: awk

我有两个这样的列:

(A)        (B)
Adam       30 
Jon        55 
Robert     35
Jokim      99
Adam       32
Adam       31
Jokim      88  

我想要一个AWK脚本检查A列中的Adam(或任何名称)是否在B列中变为30然后从A列中删除所有Adam名称,以后Adam是否变为31或32并不重要,然后打印结果

我实际上有一个日志列表,我不希望代码依赖于" Adam"。所以,我想要的基本上就是$ 2中存在30的所有位置,因此删除$ 1中的相应值,并搜索$ 1以查找与删除值相同的所有值。

2 个答案:

答案 0 :(得分:0)

要删除Adam第一次出现的条目,30:

$1 == "Adam" && $2 == 30 { found = 1 }

!(found && $1 == "Adam")

如果任何Adam,30存在,则删除所有Adam条目:

$1 == "Adam" && $2 == 30 { found = 1 }

!(found && $1 == "Adam") { lines[nlines++] = $0 }

END { for (i in lines) print lines[i] }

删除第二列中包含30的所有名称:

NR == FNR && $2 == 30 { foundnames[$1] = 1 }

NR != FNR && !($1 in foundnames)

您必须使用输入文件名两次调用此最后一个版本,即awk process.awk file.txt file.txt

答案 1 :(得分:0)

您可以read将列添加到变量中并检查第二列的值以查找您要查找的值,然后sed删除所有第1列条目的文件:

cp test.txt out.txt && CHK=30 && while read a b; do [ "${b}" = "${CHK}" ] && sed -i "/^${a}/d" out.txt done < test.txt

注意:如果您可能需要在列中使用正则表达式值,那么如果您可能有空格,则可能需要在第2列测试之前先检查空值。

由于你在这里指定AWK是一种有点优雅的awk方法,在打印之前使用check标志向前看:
awk -vCHK=30 '{if($2~CHK)block=$1; if($1!=block)print}' test.txt