两个文件中的数据比较

时间:2011-06-17 14:18:52

标签: shell unix

我有两个制表符分隔的文件。

文件1(10行,比如说4列,每行可能没有填充这些列):

Chra stra stpa NM1 NM2 NR1
Chrb strb stpb NR2 NM1

文件2(25行3列):

Tg NM1 12
Tg NM3 3
Tg NR1 76

现在我想要做的是将文件1的每一行中的NM和NR标识符与文件2 NR标识符匹配的任何位置的文件2i f进行比较。它应该从文件2中提取相应的NR / NM标识符值。

文件3可能如下所示(例如对于NM1):

chra stra stpa NM1 12
chra stra stpa NR1 76

有关shell脚本的任何建议吗?

3 个答案:

答案 0 :(得分:2)

$ join -1 4 -2 2 \
<(for i in 4 5 6 7; do join -e _ -j $i f1 f1 -o 1.1,1.2,1.3,0; done |
  sed '/_$/d' | sort -k4,4) \
<(sort -k2,2 f2) \
-o 1.1,1.2,1.3,0,2.3

Chra stra stpa NM1 12
Chrb strb stpb NM1 12
Chra stra stpa NR1 76

答案 1 :(得分:0)

而不是shell脚本,我会用Perl脚本做这种事情。你可以使用split()函数得到一个包含每一行所有“字段”的数组,并从那里开始下坡。不需要想出一个花哨的正则表达式。 Here的 做这种事情的一个例子:

答案 2 :(得分:0)

awk '
    NR == FNR {tag[$2] = $3; next}
    {
        # determine if this line has a "NR" tag from file2
        have_nr = 0
        for (i=4; i<=NF; i++) {
            if ($i ~ /^NR/ && $i in tag) {
                have_nr = 1
                break
            }
        }

        # if it does have a matching NR tag, then
        # print the tag value for every matching NR/NM tag
        if (have_nr) {
            for (i=4; i<=NF; i++) {
                if ($i in tag) {
                    print $1, $2, $3, $i, tag[$i]
                }
            }
        }
    }

' file2 file1