2016-04-26 74 views
3
echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk 'FS="_length" {print $1}' 

獲得輸出:AWK字段分隔符不工作的第一線

NODE_1_length_317516_cov_18.568_ID_4005 

預期輸出:

NODE_1 

這怎麼可能?我錯過了一些東西。

回答

7

當你通過使用awk線,字段分隔符在處理記錄之前使用。 awk根據FSRS的當前值讀取記錄,並繼續執行您要求的操作。

這意味着如果您在讀取記錄時設置了FS的值,則這不會影響該特定記錄。相反,對於下一個或更多。

所以,如果你有這樣的文件:

$ cat a 
1,2 3,4 
5,6 7,8 

並設置字段分隔符,而讀一個記錄,它需要從下一行的效果:

$ awk '{FS=","} {print $1}' a 
1,2 
5 

所以,你想要什麼要做的是在讀取文件之前設置FS。也就是說,在BEGIN塊或通過參數:

$ awk 'BEGIN{FS=","} {print $1}' a 
1 
5 
$ awk -F, '{print $1}' a 
1 
5 

也有另一種方式:可以awk重新計算完整的記錄。有了這個,awk將考慮到當前FS並採取相應的行動:

$ awk '{FS=","} {$0=$0;print $1}' a 
1 
5 
+0

假設我的第一行是'Cal_Tno_V19_F04_R02'。如何使用'awk'打印'Cal_Tno',即用分隔符打印前兩個字段? – Sigur

+0

@Sigur這似乎是我在這裏回答的完全不同的問題。如果你[提出一個新問題](/ questions/ask)提供足夠的細節,那會更好! – fedorqui

3

AWK聲明使用不當

正確的方法是

awk 'BEGIN { FS = "#{delimiter}" } ; { print $1 }' 

你的情況,你可以使用

像FS,ORS等必須在一個範圍內設置
awk 'BEGIN { FS = "_length" } ; { print $1 }' 
0

內置變量即在以下1個塊中:BEGIN,條件塊或END。

$ echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk 'BEGIN{FS="_length"} {print $1}' 
NODE_1 
$ 

您還可以通過使用-F開關這樣的分隔符:

$ echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk -F "_length" '{print $1}' 
NODE_1 
$