我需要从一个列表(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列。
非常感谢一些帮助/指导。
答案 0 :(得分:0)
尝试这样的事情:
for ids in List.txt
do
grep "[TAB;]$ids[TAB;]" Data.txt >> output.txt
done
但它有两个缺点:
如果是问题,请尝试两步版本:
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