Bash 使用awk匹配每列的行

Bash 使用awk匹配每列的行,bash,awk,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 --------+---------+------

如何使用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场比赛| A
2 | A | B比赛
1场比赛| B | 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);
    }
}

这不是家庭作业,对吧?

学究式地说,使用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);
    }
}

这不是家庭作业,对吧?

学究式地说,使用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);
    }
}

这不是家庭作业,对吧?

学究式地说,使用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);
    }
}

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

我会选择这样的方式:

$ 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
$cat文件
校长1校长2校长3
11b
31A
2 A B
1 B 1

$awk-vofs='\t''NR==2{for(i=1;i=2{for(i=1;i我喜欢这样的东西:

$ 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
$cat文件
校长1校长2校长3
11b
31A
2 A B
1 B 1

$awk-vofs='\t''NR==2{for(i=1;i=2{for(i=1;i我喜欢这样的东西:

$ 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
$cat文件
校长1校长2校长3
11b
31A
2 A B
1 B 1

$awk-vofs='\t''NR==2{for(i=1;i=2{for(i=1;i我喜欢这样的东西:

$ 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
$cat文件
校长1校长2校长3
11b
31A
2 A B
1 B 1

$awk-vofs='\t''NR==2{for(i=1;i2{for(i=1;我想你的数据实际上是这样的,有
-+-
,或者每个字段之间只有制表符吗?@anubhava,因为它不是
1
。第1列中需要的匹配是
1
。第2列中需要的匹配也是
1
,第3列中需要的匹配是
B
。每列需要独立获取。数据仅以制表符分隔。我试图通过添加
-->-+-
来澄清这一点,但事实并非如此。感谢您的评论。您的数据在
-->-+-
中实际是这样的,还是每个字段之间只有制表符?@anubhava,因为我猜它不是
1
。匹配项是第1列中需要的是
1
。第2列中需要的匹配再次是
1
,第3列中需要的匹配是
B
。每一列都需要独立进行。数据只是以制表符分隔的。我试图通过添加
-->-
来澄清这一点,但事实并非如此。谢谢您的评论。您的数据看起来真实吗像这样,对于
-->
,或者每个字段之间只有制表符吗?@anubhava,因为它不是
1
,我猜。第1列中需要的匹配是
1
。第2列中需要的匹配也是
1
,第3列中需要的匹配是
B
。每个列都需要独立进行。第e数据只是以制表符分隔的。我试图通过添加
-->-+-
来澄清这一点,但事实并非如此。谢谢您的评论。您的数据是否与
-->-+-
一样,还是每个字段之间只有制表符?@anubhava,因为我想它不是
1
。第1列中需要的匹配是
1
。第2列中需要的匹配再次是
1
,而第3列中需要的匹配是
B
。每列都需要独立进行。数据仅以制表符分隔。我试图通过添加
-->+--
来澄清这一点,但事实并非如此。感谢您的评论。很酷--不客气。如果您对这个answ感到满意的话呃,别忘了向上投票,然后单击复选标记选择它。-)酷——不客气。如果你对这个答案感到满意,别忘了向上投票,然后单击复选标记选择它。-)酷——不客气。如果您对这个答案感到满意,请不要忘记向上投票并单击复选标记选择它。-)酷——不客气。如果您对这个答案感到满意,请不要忘记向上投票并单击复选标记选择它。-)