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
还是它只是为了表示而写的?@Inianlist.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