使用awk匹配每列的行

时间:2015-10-29 19:03:25

标签: bash awk

如何使用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

2 个答案:

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

这不是家庭作业,对吧......?