Awk

使用文件 B 中的術語搜尋文件 A,並根據文件 B 中的搜尋詞將輸出保存到單個 TXT 文件

  • August 14, 2021

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

文件-B

1
2
23
78

結果 = “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

xargs -d '\n' sh -c '
   for term; do grep "$term" fileA > "$term.txt"; done
' xargs-sh < fileB

通過cas改進。

grep + 殼牌

通常使用 shell 循環來讀取文件是不好的做法,但這裡比它fileB小得多,fileA因此不會顯著影響性能。

while IFS= read -r term; do
   grep "$term" fileA > "$term.txt"
done < fileB

awk

awk 'NR==FNR{pat[$0];next}{for(term in pat){if($0~term){print>term}}}' fileB fileA
  • NR==FNR{pat[$0];next}讀取作為參數給出的第一個文件並將每一行放入數組中pat
  • {for(term in pat){if($0~term){print>term}}}是不言自明的:對於term數組中的每個,測試目前行是否與該術語匹配,如果是,則將其列印到相應命名的文件中。

並非所有 awks 都允許同時打開許多文件。正如Ed Morton所建議的,解決此問題的一種方法是使用close語句並使用附加運算符:

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

引用自:https://unix.stackexchange.com/questions/663944