使用文件 B 中的术语搜索文件 A,并根据文件 B 中的搜索术语将输出保存到单独的 TXT 文件

jah*_*719 5 grep sed awk output

FILE-A 有 100,000 行。FILE-B 是 50 个搜索词。我希望使用来自 FILE-B(CSV 或 TXT)的各种术语来完成对 FILE-A(CSV 或 TXT)的搜索,并且——这里是踢球者——将结果保存在基于搜索的单个 TXT 文件中来自 FILE-B 的条款。

例子:

文件-A

123
45678
1239870
2349878
39742366876
41967849
789
910
2378
6723
Run Code Online (Sandbox Code Playgroud)

文件-B

1
2
23
78
Run Code Online (Sandbox Code Playgroud)

结果 = "1.txt" 与 FILE-A 中的所有匹配行,"2.txt" 与 FILE-A 中的所有行匹配,"23.txt"、"78.txt" 等等。因此,如果 FILE-B 有 50 个搜索词,我最终会得到 50 个 TXT 文件,以搜索词命名,假设至少有一个来自 FILE-A 的搜索词命中。

我已经使用“fgrep -f FILE-B.txt FILE-A.csv >> output.txt”进行了搜索,这会将在 FILE-A 中找到的 FILE-B 中的所有搜索词放入一个“output.txt”中。相反,我希望将它们分成单独的文本文件。

Qua*_*odo 5

Grep + Xargs

xargs -d '\n' sh -c '
    for term; do grep "$term" fileA > "$term.txt"; done
' xargs-sh < fileB
Run Code Online (Sandbox Code Playgroud)

cas改进。

Grep + 外壳

通常使用 shell 循环读取文件是不好的做法,但这里fileB比这里小得多,fileA因此不会显着损害性能。

while IFS= read -r term; do
    grep "$term" fileA > "$term.txt"
done < fileB
Run Code Online (Sandbox Code Playgroud)

awk

awk 'NR==FNR{pat[$0];next}{for(term in pat){if($0~term){print>term}}}' fileB fileA
Run Code Online (Sandbox Code Playgroud)
  • NR==FNR{pat[$0];next}读取作为参数给出的第一个文件并将每一行放入数组中pat
  • {for(term in pat){if($0~term){print>term}}}是不言自明的:对于term数组中的每个,测试当前行是否与术语匹配,如果是,则将其打印到相应命名的文件中。

并非所有 awk 都允许同时打开多个文件。正如Ed Morton所建议的那样,解决这个问题的一种方法是使用close语句并使用 append 运算符:

awk 'NR==FNR{pat[$0];next}{for(term in pat){if($0~term){print>>term;close(term)}}}' fileB fileA
Run Code Online (Sandbox Code Playgroud)