我有两个这样的列:
(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以查找与删除值相同的所有值。
答案 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