Text-Processing
是否可以使用 grep 或 awk 報告與索引文件中重複條目相對應的重複輸出行?
我似乎無法讓 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