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”中。相反,我希望将它们分成单独的文本文件。
xargs -d '\n' sh -c '
for term; do grep "$term" fileA > "$term.txt"; done
' xargs-sh < fileB
Run Code Online (Sandbox Code Playgroud)
由cas改进。
通常使用 shell 循环读取文件是不好的做法,但这里fileB比这里小得多,fileA因此不会显着损害性能。
while IFS= read -r term; do
grep "$term" fileA > "$term.txt"
done < fileB
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |