編程初學者在這裏需要一些幫助修改AWK腳本以使其具備條件。另一種非awk解決方案也非常受歡迎。awk有條件地過濾一個基於另一個文件(或其他解決方案)的文件
備註主要過濾功能現在可以在Birei的幫助下工作,但我還有一個額外的問題,詳情請參閱下面的註釋。
我有一系列的輸入文件的3列像這樣:
chr4 190499999 190999999
chr6 61999999 62499999
chr1 145499999 145999999
我想用這些行來過濾其他文件(refGene.txt),如果在文件中的一個行符合項目在一排refGene.txt,將refGene.txt中的第13列輸出到一個新文件'ListofGenes_ $ f'。 對我來說,棘手的部分是,只要第一列(例如'chr4','chr6','chr1')和第二列的AND/OR列3與refGene中的等價列匹配,我希望它被視爲匹配.txt文件。兩個文件之間的等效列是$ 1 = $ 3,$ 2 = $ 5,$ 3 = $ 6。 然後,我不知道在AWK如何不打印從refGene.txt整行,但僅列13
注意我已經實現得益於上述從Birei幫助有條件的篩選。現在我需要加入一個額外的過濾條件。如果$ 2和$ 3之間的任何區域與refGene.txt文件中$ 5和$ 6之間的區域重疊,我還需要從refGene.txt文件輸出$ 13列。這似乎更加棘手,因爲它涉及數學計算以查看區域是否重疊。
我至今腳本:
FILES=/files/*txt
for f in $FILES ;
do
awk '
BEGIN {
FS = "\t";
}
FILENAME == ARGV[1] {
pair[ $1, $2, $3 ] = 1;
next;
}
{
if (pair[ $3, $5, $6 ] == 1) {
print $13;
}
}
' $(basename $f) /files/refGene.txt > /files/results/$(basename $f) ;
done
任何幫助非常感謝。非常感謝!
Rubal
@ user964689:我一見鍾情就明白了這個問題。我編輯了答案。我不完全明白你想如何比較字段,但是代碼是註釋的,所以如果結果接近你正在尋找的解決方案,修改應該不會太難。 – Birei
非常感謝,儘管我意識到我必須添加一個額外的要求,使其更加複雜。我編輯了這個問題來反映這一點。如果你能幫上忙,那就太棒了。謝謝。 – user964689