如何使用awk查找每列中第2行匹配的值?
我想接受一个标签限制文件,如果第2行下面的任何行与第2行匹配,则打印字段为“匹配”。
转换此制表符分隔文件:
header1 | header2 | header3
1 | 1 | B
--------+---------+----------
3 | 1 | A
2 | A | B
1 | B | 1
对此:
header1 | header2 | header3
1 | 1 | B
--------+---------+----------
3 | 1 match | A
2 | A | B match
1 match | B | 1
答案 0 :(得分:2)
我会选择这样的事情:
$ cat file
header1 header2 header3
1 1 B
3 1 A
2 A B
1 B 1
$ awk -v OFS='\t' 'NR == 2 { for (i=1; i<=NF; ++i) a[i] = $i }
NR > 2 { for(i=1;i<=NF;++i) if ($i == a[i]) $i = $i " match" }1' file
header1 header2 header3
1 1 B
3 1 match A
2 A B match
1 match B 1
在第二行,使用每个字段的内容填充数组a
。在后续行中,添加&#34;匹配&#34;当它们匹配数组中的相应值时。最后的1
是一种常见的简写,导致每行打印。将输出字段分隔符OFS
设置为制表符可保留数据的格式。
答案 1 :(得分:1)
谦虚地,GNU Awk 4.1.1
:
awk -f so.awk so.txt
header1 header2 header3
1 1 B
3 1* A
2 A B*
1* B 1
so.awk
:
{
if(1 == NR) {
print $0;
} else if(2 == NR) {
for(i = 1; i <= NF; i++) {
answers[i]=$i;
}
print $0;
} else {
for(i = 1; i <= NF; i++) {
field = $i;
if(answers[i]==$i) {
field = field "*" # a match
}
printf("%s\t",field);
}
printf("%s", RS);
}
}
和so.txt
作为制表符分隔的数据文件:
header1 header2 header3
1 1 B
3 1 A
2 A B
1 B 1
这不是家庭作业,对吧......?