两个文件中的数据比较

发布于 2024-11-16 02:17:04 字数 440 浏览 0 评论 0原文

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

文件 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

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

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

chra stra stpa NM1 12
chra stra stpa NR1 76

对于 shell 脚本有什么建议吗?

I have two tab-delimited files.

File 1 (10 rows and say 4 columns, these columns might not be filled in each row):

Chra stra stpa NM1 NM2 NR1
Chrb strb stpb NR2 NM1

File 2 (25 rows and 3 columns):

Tg NM1 12
Tg NM3 3
Tg NR1 76

Now what I want to do, is to compare the NM and NR identifiers in present each row of file 1 to file 2i f anywhere in file2 NR identifier matches. It should extract the corresponding value of NR/NM identifier from file 2.

File 3 may look like this (say for NM1):

chra stra stpa NM1 12
chra stra stpa NR1 76

Any suggestions for a shell script?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我不吻晚风 2024-11-23 02:17:04
$ 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
$ 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
听你说爱我 2024-11-23 02:17:04

我会使用 Perl 脚本而不是 shell 脚本来完成这种事情。您可以使用 split() 函数获取一个包含每行所有“字段”的数组,从那里开始走下坡路。无需想出一个花哨的正则表达式。 这里
做这种事情的一个例子:

Rather than shell script, I'd do this kind of thing with a Perl script. You can use the split() function to get an array with all the "fields" for each line, and it's downhill from there. No need to think up a fancy regular expression. Here's
an example of doing this kind of thing:

征棹 2024-11-23 02:17:04
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
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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文