Bash 读取文件列的每一行并执行grep

Bash 读取文件列的每一行并执行grep,bash,awk,grep,echo,Bash,Awk,Grep,Echo,我这里有file.txt示例: This line contains ABC This line contains DEF This line contains GHI 下面是list.txt: contains ABC<TAB>ABC contains DEF<TAB>DEF 这是我的grep/echo代码,用于手动放置查询/返回字符串: if grep -i -q 'contains abc' file.txt then echo ABC >outp

我这里有
file.txt
示例:

This line contains ABC
This line contains DEF
This line contains GHI
下面是
list.txt

contains ABC<TAB>ABC
contains DEF<TAB>DEF
这是我的grep/echo代码,用于手动放置查询/返回字符串:

if grep -i -q 'contains abc' file.txt
then
    echo ABC >output.txt
else
    echo -n
fi
if grep  -i -q 'contains def' file.txt
then
    echo DEF >>output.txt
else
    echo -n
fi
我有大约100个搜索词,这使得手工完成的任务很费力。那么,我如何在读行时包含
;做[命令];使用awk和grep完成:

for text in `awk '{print $4}' file.txt `
do
  grep "contains $text" list.txt |awk -F $'\t' '{print $2}'
done
像这样的

$ awk -F'\t' 'FNR==NR { a[$1] = $2; next } {for (x in a) if (index($0, x)) {print a[x]}}     '   list.txt file.txt
ABC
DEF
对于第一个文件的行(
FNR==NR
),读取数组
a
的键值对。然后,对于第二行的行,在数组中循环,检查是否在该行中找到键,如果找到,则打印存储的值<代码>索引($0,x)
尝试从(当前行)
$0
中查找
x
的内容
$0~x
会将
x
作为要匹配的正则表达式


如果要在shell中执行此操作,请为
list.txt
的每一行启动一个单独的
grep
,如下所示:

while IFS=$'\t' read k v ; do 
    grep -qFe "$k" file.txt && echo "$v"
done < list.txt
而IFS=$'\t'读取k v;做
grep-qFe“$k”file.txt和echo“$v”
完成
readkv
读取一行输入并将其(基于
IFS
)拆分为
k
v

grep-F
将模式作为固定字符串,而不是正则表达式,并且
-q
阻止它输出匹配行<如果在file.txt中找到
$k
,则code>grep
会返回true,因此如果在file.txt中找到
$k
,则会打印
$v

首先,将
列表.txt的
列1
列2
读取并存储为数组。然后您可以在通过
file.txt仅读取行
并执行命令的同时
。list.txt上的第1列只是
包含
?你的意思是吗?详细说明你的输入,你是
file.txt
完全包含
这一行包含ABC
还是它只是为了表示而写的?@Inian
list.txt
包含
file.txt
@RomanPerekhrest的子字符串是的,
file.txt
完全包含
这一行包含ABC
等等!我想档案里有点混乱。awk的输入应该是
list.txt
,grep的输入应该是
file.txt
,感谢您的
awk
解决方案。然而,我仍然试图理解
grep
:我尝试了一个稍微不同的命令:
,而IFS=$'\t'读取kv;如果($(grep-i'$k'file.txt | wc-l)>=2),则执行该操作;然后回显“$k多于2”;fi;done@tobi,注意您使用的引号类型,变量不会在单引号中展开,因此
grep'$k'
将查找文本字符串
$k
。此外,您还可以使用
grep-c
而不是
grep | wc-l
while IFS=$'\t' read k v ; do 
    grep -qFe "$k" file.txt && echo "$v"
done < list.txt