Text-Processing

是否可以使用 grep 或 awk 報告與索引文件中重複條目相對應的重複輸出行?

  • June 16, 2020

我似乎無法讓 grep 或 awk 對列表進行相對簡單的索引拉取。我懷疑這是因為索引文件中有相鄰的重複項,我沒想到會導致問題。奇怪的是在網上尋找解決方案並沒有成功,因為我發現的所有查詢都是想要刪除重複項而不是保留它們的人!

索引文件看起來像這樣,有大約 40k 條目,其中許多被排序為重複項:

n0000003
n0000003
n0000008
n0000008
n0000017
n0000017
n0000017
n0000017
.....etc

搜尋文件看起來像這樣,每個標識符都有大約 10k 個唯一條目:

n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
...etc

我需要的是這樣的輸出,重複輸出條目等於索引文件中重複索引條目的數量:

n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
...etc

但是 grep 和 awk 都只給出一個條目(使其與搜尋文件相同)。我認為 grep 可以處理重複重複沒問題,但我找不到解決方法。

這些是我希望能夠工作的命令,例如:

grep -f index.txt searchfile.txt > output.txt
awk -F'\t' 'NR==FNR{c[$1]++;next};c[$1]' index.txt searchfile.txt > output.txt

任何關於如何讓 grep 或 awk 輸出正確重複次數的建議都會很棒!非常感謝!安德魯

我不認為你可以用grep, 不,但你可以在awk. 我能想到的最簡單的方法是將 的內容儲存searchfile.txt在記憶體中,然後每次看到索引時列印它的行:

$ awk -F'\t' 'NR==FNR{c[$1]=$0;next}{if(c[$1]){print c[$1]}}' searchfile.txt index.txt 
n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084

如果兩個文件都按索引排序,您還可以使用join

$ join -t$'\t' searchfile.txt index.txt 
n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084

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