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

时间:2018-03-12 16:55:15

标签: linux string search awk grep

我有一个多列文件如下:

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列中4th的{​​{1}}列,如果它存在,则打印file2.txt列的1st,2nd,3rd列在file1.txt的内容之上4th file2.txtfile2.txt {/ 1}}。

例如4th1st line的{​​{1}}列 AJ-lett-K-MD 。它存在于file1.txt 4th的{​​{1}}列中。

因此,我需要打{{1​​}} 1st and 2nd lines file2.txt 1st,2nd and 3rd colums 1st line file1.txt 4th columns1st and 2nd lines

所以预期的输出应该是:

file2.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 的字词作为变量,然后在file1.txt中搜索:

file2.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会更好吗?任何帮助表示赞赏!

PS:python中的4th列不是唯一的,我需要所有匹配(不仅是第一个匹配)。

重要编辑:我在另一个更好的方式解释了我的问题:Searching partial match of string in a column in a column of another file 他们寻找相似但不同的产出。

1 个答案:

答案 0 :(得分:2)

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