我有一个多列文件如下:
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.txt
列file2.txt
{/ 1}}。
例如4th
中1st 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 columns
个1st 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 他们寻找相似但不同的产出。
答案 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