2013-07-29 38 views
0

我有一個不同的行大文件。如何通過n過濾文件。模式後的字符串?

我很感興趣的線路,尋找相似:

lcl|NC_005966.1_gene_59 scaffold441.6 99.74 390 1 0 1 390 34065 34454 0.0 715 
lcl|NC_005966.1_gene_59 scaffold2333.4 89.23 390 42 0 1 390 3114 2725 1e-138 488 
lcl|NC_005966.1_gene_60 scaffold441.6 100.00 186 0 0 1 186 34528 34713 1e-95 344 

現在我想要得到的模式後線「LCL | NC_」只是如果第三字(或第n個字線)小於100

(在這種情況下,前兩行,因爲他們剛剛得到99.74和89.23)

下一個號碼,他們應該被保存到一個新文件。

回答

3

這可以使:

$ awk '$1 ~ /^lcl\|NC_/ && $3<100' file 
lcl|NC_005966.1_gene_59 scaffold441.6 99.74 390 1 0 1 390 34065 34454 0.0 715 
lcl|NC_005966.1_gene_59 scaffold2333.4 89.23 390 42 0 1 390 3114 2725 1e-138 488 

它檢查兩件事:
- 第一場開始lcl|NC_$1 ~ /^lcl\|NC_/做的。 (Thanks Ed Morton for improving以前的$1~"^lcl|NC_"
- 第3字段是< 100:$3<100

要保存到一個文件,你可以這樣做:

awk '$1 ~ /^lcl\|NC_/ && $3<100' file > new_file 
             ^^^^^^^^^^ 
+0

+1的做法,但你需要躲避「|」兩次,即'$ 1〜'^ lcl \\ | NC_「'而不是'$ 1〜'^ lcl | NC_」'。由於寫成'|'意思是「或」,因爲它是一個RE元字符,所以它匹配以lcl開頭或包含NC_的行,並且需要將其轉義兩次或使用'[|]',因爲它在字符串中並且被解析兩次由awk。其實 - 你應該使用/../而不是「..」:'$ 1〜/^lcl \ | NC_ /'來清楚說明你正在做一個RE比較並簡化一下。 –

+1

非常感謝@EdMorton的改進!我沒有注意到我寫的條件不夠好。現在我測試了你的代碼,它就像一個魅力。剛剛更新了我的答案。 – fedorqui