我有一个包含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/

10-16 10:33