[英]While read loop appending
我必須從file1
提取與file2
中的單詞列表相對應的行
我想知道這樣做有什么區別:
while read line; do grep "${line}" file1; done < file2 > output
while read line; do grep "${line}" file1 >> output; done < file2
哪一個是正確和最致命的?
除了循環,還有其他更快的方法嗎?
我正在處理的兩個文件分別為file1
和file2
536864856
和1947
行。
文件 1(看起來 7 美元)
NC_045027.1 29500101 T/A NC_045027.1:29500101 A 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2764 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500102 G/A NC_045027.1:29500102 A 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2763 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500103 C/A NC_045027.1:29500103 A 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2762 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500104 C/A NC_045027.1:29500104 A 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2761 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500105 A/C NC_045027.1:29500105 C 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2760 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500106 A/C NC_045027.1:29500106 C 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2759 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500107 G/A NC_045027.1:29500107 A 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2758 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500108 T/A NC_045027.1:29500108 A 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2757 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500109 G/A NC_045027.1:29500109 A 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2756 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_045027.1 29500110 G/A NC_045027.1:29500110 A 101232882 XM_032744187.1 Transcript 3_prime_UTR_variant 2755 - - - - - MODIFIER - -1 - ARL14EPL - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16147 C/A NC_044998.1:16147 A 100221041 XM_030285707.2 Transcript 3_prime_UTR_variant 7416 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16147 C/A NC_044998.1:16147 A 100221041 XM_030285715.2 Transcript 3_prime_UTR_variant 7234 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16147 C/A NC_044998.1:16147 A 100221041 XM_030285720.2 Transcript 3_prime_UTR_variant 7110 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16147 C/A NC_044998.1:16147 A 100221041 XM_030285728.2 Transcript 3_prime_UTR_variant 6856 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16147 C/A NC_044998.1:16147 A 100221041 XM_030285733.2 Transcript intron_variant -- - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz --
NC_044998.1 16147 C/A NC_044998.1:16147 A 100221041 XM_030285738.2 Transcript 3_prime_UTR_variant 6637 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16147 C/A NC_044998.1:16147 A 100221041 XM_030285750.2 Transcript 3_prime_UTR_variant 6348 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16147 C/A NC_044998.1:16147 A 100221041 XM_030285760.2 Transcript 3_prime_UTR_variant 7209 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16148 A/C NC_044998.1:16148 C 100221041 XM_030285707.2 Transcript 3_prime_UTR_variant 7415 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
NC_044998.1 16148 A/C NC_044998.1:16148 C 100221041 XM_030285715.2 Transcript 3_prime_UTR_variant 7233 - - - - - MODIFIER - -1 - LOC100221041 - - - ZFgenomic_tabixprep_nomiRNA.gff.gz - -
文件 2
XM_032744187.1
XM_030272916.2
XM_032747381.1
XM_030265061.2
XM_030271469.2
XM_030272412.2
XM_032747456.1
while read line; do grep "${line}" file1; done < file2 > output
while read line; do grep "${line}" file1 >> output; done < file2
哪一個是正確和最快的?
第一個因為它只會打開輸出文件一次,而循環內的>> output
將為file2
每一行打開輸出文件。
除了循環,還有其他更快的方法嗎?
根據相關的更新信息,此awk
將產生准確的匹配結果,而grep -fF
無法grep -fF
。 awk
也會非常快,因為在對第二個文件中的$7
進行非正則表達式字符串比較之前,我們只讀取內存中較小文件的第一列:
awk 'FNR == NR {seen[$1]; next} $7 in seen' file2 file1 > output
無循環: grep -f file2 file1
您可能會考慮grep -Ff file2 file1
和-F
用於固定字符串。 如果您的file2
不是正則表達式,而是純文本,則使用-F
可以加快大型輸入的速度。
第一個將擦除在命令運行之前output
可能具有的任何內容。
此外,第一個將只打開文件一次。 每次運行grep
命令時,第二個將重新打開文件。 例如,如果您希望在命令運行時移動文件,這可能很重要。 如果您不需要擔心這種情況,您應該更喜歡第一個版本:它會稍微快一點,因為它不必一遍又一遍地執行目錄查找。
在不知道您想要完成什么的情況下,沒有辦法說哪一個是“正確的”。
對於該任務, fgrep 是您的朋友。 fgrep 的手冊頁看起來很清楚,所以我不會重復。 在這里你會說
fgrep -x -f file1 file2 > output
(-x 選項強制 fgrep 只匹配整行。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.