【问题标题】:Partial id match and merge multiple to one部分 id 匹配并合并多为一
【发布时间】:2015-07-29 10:31:18
【问题描述】:

我有两个文件,File1 和 File2。 File1 有 6000 行,file2 有 3000 行。我想匹配 id 并根据匹配合并文件,这很简单。但是,file1 和 file2 中的 id 仅部分匹配。看看文件。对于 file2 中的每个 id(行),文件 1 中必须有两个匹配的 id(行)。此外,并非 file2 中的所有 id 都存在于 file1 中。我试过 awk 但没有得到想要的输出。

文件1

1_A01_A
1_A01_B
2_B03_A
2_B03_B
1_A02_A
1_A02_B
2_B04_A
2_B04_B
1_A03_A
1_A03_B
2_B05_A
2_B05_B
1_A04_A
1_A04_B
2_B06_A
2_B06_B
1_A06_A
1_A06_B
2_B07_A
2_B07_B
1_A07_A
1_A07_B
2_B08_A
2_B08_B
9_F10_A
9_F10_B
12_D08_A
12_D08_B
5505744243493_F09.CEL_A_A
5505744243493_F09.CEL_B_B

文件2

1_A01   14
2_B03   13
1_A02   4
2_B04   14
1_A03   11
2_B05   8
1_A04   18
2_B06   15
1_A06   10
2_B07   4
1_A07   8
2_B08   22
1_A08   5
2_B09   15
1_A09   20
2_B10   17

【问题讨论】:

    标签: awk sed match


    【解决方案1】:

    awk -F" " 'FNR==NR{a[$1]=$2;next}{for(i in a){if($1~i){print $1" "a[i];next}}}' file1.txt file2.txt

    FNR==NR 在 awk 读取文件 1 时为真,在读取文件 2 时为假。从 {for(i in a} .. 开始的部分代码将针对文件 2 执行。$1~i 查找类似条件,然后为相关匹配打印输出。

    我错误地使用了不同的文件符号。我的 file1.txt 包含问题陈述中 file2.txt 的内容,反之亦然

    输出
    1_A01_A|14
    1_A01_B|14
    2_B03_A|13
    2_B03_B|13
    1_A02_A|4
    1_A02_B|4
    2_B04_A|14
    2_B04_B|14
    1_A03_A|11
    1_A03_B|11
    2_B05_A|8
    2_B05_B|8
    1_A04_A|18
    1_A04_B|18
    2_B06_A|15
    2_B06_B|15
    1_A06_A|10
    1_A06_B|10
    2_B07_A|4
    2_B07_B|4
    1_A07_A|8
    1_A07_B|8
    2_B08_A|22
    2_B08_B|22

    【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -r 's|^(\S+)(\s+\S+)$|s/^\1.*/\&\2/p|' file2 | sed -nf - file1
    

    这会从 file2 创建一个 sed 脚本,然后针对 file1 中的数据运行它。

    注意任何一个文件的顺序都不重要,file1 只被处理一次。

    【讨论】:

    • 不走运。遇到错误,sed: -e expression #1, char 11: unterminated `s' command
    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2022-11-29
    相关资源
    最近更新 更多