我需要一个简单的 awk 脚本的帮助来匹配行上的字母。
例如,在一个字段中为 KJ 查找单独的匹配项,并在下一个字段中为 KP 查找匹配项?
Name VT Kip Rand
NINA K K kevdhekdmabr2738
NINA J P pdbkemgwjsabeb483
NINA A J meveahsbkdemjep48328
NINA P K ehkmskdldadvsvpm46383
NINA M P zbdamshasjerrj3738
NINA J K amfjekspdbejd34549
NINA P M pokjdokdam2452355235
如您所见,所有 Rand 列都有一系列与我需要的字母相匹配的字母。如果尝试过awk '/nina/ && /K/ && /J/ && /K/ && /P/ {print $0}' sampfile.txt
有没有办法可以做到这一点而不参考特定的列/字段?
答案1
我不知道你对命名列有什么意见。如果你想指定其中的内容,你需要具体地调用它们。
awk 'NR>1 && $2~/^[KJ]$/ && $3~/^[KP]$/ {print $1}' ...
这将匹配K-K
、K-P
和J-K
并J-P
打印名称列。它还将跳过看起来像标题的第一行。
它与示例中的以下几行相匹配:
NINA K K kevdhekdmabr2738
NINA J P pdbkemgwjsabeb483
NINA J K amfjekspdbejd34549
但显然只打印NINA
。
答案2
据我了解,您想要显示符合此条件的行:
每行任意一列包含两个“K”标记,且下一行包含:第一个“K”同一列中的“J”标记和第二个“K”同一列中的“P”标记
这个程序可以满足你的需要
BEGIN { nlines = 0; }
{
lines[nlines] = $0;
kfound[nlines] = "";
jfound[nlines] = "";
pfound[nlines] = "";
for (i=1;i<=NF;i++) {
if ($(i) == "K") kfound[nlines] = kfound[nlines] " " i;
if ($(i) == "J") jfound[nlines] = i;
if ($(i) == "P") pfound[nlines] = i;
}
nlines++;
}
END {
for(i=0;i<nlines;i++) {
ntok = split(kfound[i],tok," ");
if (ntok < 2) continue;
if (tok[1] == jfound[i+1] && tok[2] == pfound[i+1]) {
print lines[i];
print lines[i+1];
}
}
}
保存在文件 test.awk 中并尝试:
awk -f test.awk fileWithInputLine.txt