我有一个包含4000个单词的列表(A.txt
)。现在我想把另一个文件(sentence_per_line.txt
)中包含文件A.txt
中提到的4000个单词的行用grep标记出来。
我为上述问题编写的shell脚本是
#!/bin/bash
file="A.txt"
while IFS= read -r line
do
# display $line or do somthing with $line
printf '%s\n' "$line"
grep $line sentence_per_line.txt >> output.txt
# tried printing the grep command to check its working or not
result=$(grep "$line" sentence_per_line.txt >> output.txt)
echo "$result"
done <"$file"
A.txt
看起来像这样applicable
available
White
Black
..
代码既不工作也不显示任何错误。
最佳答案
grep内置了这个:
grep -f A.txt sentence_per_line.txt > output.txt
代码注释:
循环文件以在每一行上执行grep/sed/awk通常是一种反模式,请参见this Q&A。
如果
$line
参数包含多个单词,则必须引用它(无论如何都不会造成伤害),否则grep将尝试在以第二个单词命名的文件中查找第一个单词:grep "$line" sentence_per_line.txt >> output.txt
如果在循环中写入输出,不要在循环内重定向,请在循环外执行:
while read -r line; do
grep "$line" sentence_per_line.txt
done < "$file" > output.txt
但请记住,这通常不是一个好主意。
如果您想写入文件,同时查看正在写入的内容,可以使用
tee
:grep "$line" sentence_per_line.txt | tee output.txt
写入
output.txt
和stdout。如果
A.txt
包含仅当完整单词匹配时才要匹配的单词,即pattern
不应匹配longerpattern
,则可以使用grep -wf
–该-w
只匹配完整单词。如果
A.txt
中的单词不是正则表达式,而是固定字符串,则可以使用grep -fF
–使用-F
选项可以查找固定字符串并且速度更快。这两者可以合并:grep -WfF
关于linux - 从输入文件中读取单词,然后将包含另一个文件中单词的行换行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37314148/