比较两个文件,打印标题if

时间:2014-05-01 22:29:00

标签: regex awk compare

我有两个文件。第一行是标题行。

File1中

start end
234 789
678 780
125 457
534 988

文件2

start end abc efg hij klm nmo
234 789 NA NA 01 02 NA
678 780 01 NA NA NA NA
125 457 NA 01 01 NA 02
534 988 NA NA NA NA 02

现在我要比较这两个文件; File1的coloumn1和column2以及File2的Column1和Column2。如果它们匹配,我想用File2的column1和column2打印第三个文件,然后打印字段字符不等于'NA'的列标题,如下面的输出文件

start end
234 789 hij, klm
678 780 abc
125 457 efg, hij, nmo
534 988 nmo

我只知道比较线条;但不知道是否可以打印与“NA”模式不匹配的标题。

2 个答案:

答案 0 :(得分:0)

您可以尝试awk -f a.awk file2 file1,其中a.awk是:

NR==FNR {
    if (NR==1) {
        split($0,b)
        next
    }
    s="";
    for (i=3; i<=NF; i++) {
        if ($i!="NA") {
            if (s) 
                s=s", " b[i]
            else
                s=b[i]
        }
    }
    a[$1,$2]=s
    next
}
FNR==1 {next}
($1,$2) in a {
    print $1,$2,a[$1,$2]
}

输出:

234 789 hij, klm
678 780 abc
125 457 efg, hij, nmo
534 988 nmo

答案 1 :(得分:0)

这是使用awk的一种方式。像:

一样运行
awk -f ./script.awk File1 File2 > File3

script.awk的内容:

NR==1 {

    h=$0
    next
}

FNR==NR {

    a[$1,$2]
    next
}

FNR==1 {

    split($0, b)
    print h

    next
}

($1,$2) in a {

    for (i=3;i<=NF;i++) {

        c = ($i != "NA" ? b[i] : "")

        if (c) {

            r = (r ? r ", " : "") c
        }
    }

    print $1, $2, r
    r = c = ""
}

File3的结果和内容:

start end
234 789 hij, klm
678 780 abc
125 457 efg, hij, nmo
534 988 nmo