gpt4 book ai didi

linux - 迭代 Bash 脚本错误

转载 作者:太空宇宙 更新时间:2023-11-04 10:10:36 25 4
gpt4 key购买 nike

我尝试使用 bash 脚本逐行迭代一个只有大约 700 个单词的文本文件,然后在当前目录中使用特定文件上的单词运行不区分大小写的 grep 搜索。为了分解它,我试图将以下内容输出到文件中:

  1. Append a newline to a file, then the searched word, then another newline
  2. Append the results of the grep command using that search
  3. Repeat steps 1 and 2 until all words in the list are exhausted

例如,如果我有这个 list.txt:

search1
search2

我希望 results.txt 是:

search1:
grep result here

search2:
grep result here

我在堆栈交换中找到了一些关于如何做到这一点的答案,并提出了以下实现:

#!/usr/bin/bash

while IFS = read -r line;
do
"\n$line:\n" >> "results.txt";
grep -i "$line" *.in >> "results.txt";
done < "list.txt"

但是,出于某种原因,这个(以及我尝试过的许多变体)不起作用。看起来微不足道,但我觉得这让我难以置信。感谢您的帮助。

最佳答案

如果您将脚本更改为:

while IFS= read -r line; do
printf '\n%s:\n' "$line"
grep -i "$line" *.in
done < list.txt > results.txt

但它会非常慢。参见 https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice为什么在编写一个 shell 循环来操作文本之前你应该仔细考虑。用于操作文本的标准 UNIX 工具是 awk:

awk '
NR==FNR { words2matches[$0]; next }
{
for (word in words2matches) {
if ( index(tolower($0),tolower(word)) ) {
words2matches[word] = words2matches[word] $0 ORS
}
}
}
END {
for (word in words2matches) {
print word ":" ORS words2matches[word]
}
}
' list.txt *.in > results.txt

当然,以上内容未经测试,因为您没有提供我们可以测试的示例输入/输出。

关于linux - 迭代 Bash 脚本错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49314856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com