代码之家  ›  专栏  ›  技术社区  ›  bapors

在linux中搜索另一个文件的另一列中的列

  •  0
  • bapors  · 技术社区  · 7 年前

    我有一个多列文件,如下所示:

    file1.txt
    1 12 220 AJ-lett-K-MD
    2 33 312 BCJ-23-660-numm
    4 22 55  lett-C-100b
    5 52 59  lett-C-100bc
    6 82 995 numm-X-aab
    

    file2.txt
    
    1 338 339 89839,lett;847447,AJ-lett-K-MD
    2 223 443 numm;33920;numm3,AJ-lett-K-MD,50
    3 443 223 AFFVlett-C-100b,lett-C-100b
    4 542 442 187;lett-C-100bc
    7 765 765 XXXX-CCC
    

    我正在尝试搜索 4th 第列,共列 file1.txt 在里面 第四 第列,共列 file2.txt ,如果存在,则打印 1st,2nd,3rd 列,共列 文件1.txt 使用 第四 第列,共列 文件2.txt ,位于 文件2.txt

    例如 第四 第列,共列 1st line 在里面 文件1.txt AJ-lett-K-MD 。它存在于 第四 列,共列 1st and 2nd lines 在里面 文件2.txt

    所以,我需要打印 1st,2nd and 3rd colums 属于 第1行 属于 文件1.txt 具有 4th columns 属于 第1和第2行 属于 文件2.txt :

    因此,预期输出应为:

    expected.txt
    1 338 339  89839,lett;847447,AJ-lett-K-MD --> original
    1 12  220  89839,lett;847447,AJ-lett-K-MD --> combination of file1 and file2
    2 223 443  numm;33920;numm3,AJ-lett-K-MD,50 --> original
    1 12  220  numm;33920;numm3,AJ-lett-K-MD,50 --> combination of file1 and file2
    3 443 223  AFFVlett-C-100b,lett-C-100b --> original
    4 22  55   AFFVlett-C-100b,lett-C-100b --> combination
    4 542 442  187;lett-C-100bc --> original
    4 22  55   187;lett-C-100bc --> combination
    5 52  59   187;lett-C-100bc --> combination
    7 765 765 XXXX-CCC
    

    我的考验是 文件1.txt 作为变量,然后在 文件2.txt :

    grep -v ^# file1.txt | while read a b c d; do echo a=$a b=$b c=$c d=$d;
    grep "$d" file2.txt
    

    它给出了:

    1 338 339 89839,lett;847447,AJ-lett-K-MD
    2 223 443 numm;33920;numm3,AJ-lett-K-MD,50
    3 443 223 AFFVlett-C-100b,lett-C-100b
    4 542 442 187;lett-C-100bc
    

    但是,我不知道如何继续。使用 awk python ?感谢您的帮助!

    PS:The 第四 中的列 文件1.txt 不是唯一的,我需要所有匹配项(不仅仅是第一个)。

    重要编辑:我在以下网站上以不同和更好的方式解释了我的问题: Searching partial match of string in a column in a column of another file 他们寻找相似但不同的输出。

    1 回复  |  直到 7 年前
        1
  •  2
  •   karakfa    7 年前

    awk 救命啊!

    假设file1键是唯一的,并且需要第一个匹配项

    $ awk 'NR==FNR{a[$4]=$1 FS $2 FS $3; next}
                  {for(k in a) 
                     if("," $4 "," ~ "(,|;)" k "(,|;)") 
                        {print; print a[k],$4; break}}' file1 file2
    

    如果需要所有匹配项,请删除 break

    如果键不是唯一的,这种方法只能从第一个文件中获取键值的最后一个实例。以下代码将处理非唯一键和多个匹配项

    $ awk 'NR==FNR{a[++c[$4],$4]=$1 FS $2 FS $3; next}
                  {for(k in c)
                     if("," $4 "," ~ "(,|;)" k "(,|;)") 
                       for(j=1;j<=c[k];j++) print $0 ORS a[j,k],$4}' file1 file2