从另一个文件的列中的一个文件中查找公共元素,并输出后者的整行

时间:2015-02-11 02:53:17

标签: unix grep

我需要从一个列表(list.txt)中提取所有匹配,这些列表可以在另一个列(此处为Data.txt)的列中找到第三个(output.txt)。

Data.txt(制表符分隔)

some_data more_data other_data here yet_more_data etc
A B 2 Gee;Whiz;Hello 13 12
A B 2 Gee;Whizz;Hi 56 32
E   4 Btm;Lol 16 2
T   3 Whizz 13 3

LIST.TXT

Gee
Whiz
Lol

理想情况下,output.txt看起来像

some_data more_data other_data here yet_more_data etc
A B 2 Gee;Whiz;Hello 13 12
A B 2 Gee;Whizz;Hi 56 32
E   4 Btm;Lol 16 2

所以我尝试了一个shell脚本

for ids in List.txt 
do
grep $ids Data.txt >> output.txt
done 

除了我在所述脚本中输入List.txt中的所有内容(实际剪切和粘贴)。

不幸的是,它给了我output.txt包括最后一行,我假设为' Whiz'包含' Whiz'。

我也试过了cat Data.txt | egrep -F "List.txt",这导致了grep: conflicting matchers specified - 我想这对我来说太天真了。实际文件:List.txt包含985个单词的排序列表,Data.txt包含115576行,17列。

非常感谢一些帮助/指导。

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

for ids in List.txt 
do
  grep "[TAB;]$ids[TAB;]" Data.txt >> output.txt
done

但它有两个缺点:

  1. " DATA.TXT"多次扫描
  2. 您可以多次获得一行。
  3. 如果是问题,请尝试两步版本:

    cat List.txt | sed -e "s/.*/[TAB;]\0[TAB;]/g" > List_mod.txt
    grep -f List_mod.txt Data.txt > output.txt
    

    注意: 可以通过Ctrl-V组合插入TAB字符,然后按命令行中的Tab键和编辑器中的Tab字符插入。您必须检查编辑是否未将制表符更改为一系列空格。

答案 1 :(得分:0)

用于一般文本处理的UNIX工具是“awk”:

awk '
NR==FNR { list[$0]; next }
{
    for (word in list) {
        if ($0 ~ "[\t;]" word "[\t;]") {
            print
            next
        }
    }
}
' List.txt Data.txt > output.txt