2008-10-17 33 views
6

我有一個由管道字符分隔的字段的文件,我只想打印第二個字段。此嘗試失敗:如何從管道分隔文件打印字段?

$ cat file | awk -F| '{print $2}' 
awk: syntax error near line 1 
awk: bailing out near line 1 
bash: {print $2}: command not found 

有沒有辦法做到這一點?

回答

9

這裏的關鍵是管道字符(|)必須轉義到shell。使用「\|」或「'|'」來保護它免受外殼干擾,並允許它在命令行上傳遞到awk


閱讀中,我看到,原來的海報介紹其中涉及過濾file選擇和打印領域之前的原始問題的簡化版本的意見。使用了通過grep的傳遞,並將結果傳送到awk進行字段選擇。這說明問題中出現的完全不必要的cat file(它取代了grep <pattern> file)。

好的,這將工作。然而,awk在很大程度上是一種模式匹配工具,可以信任在匹配行中查找和工作,而無需調用grep。使用類似:

awk -F\| '/<pattern>/{print $2;}{next;}' file 

/<pattern>/位告訴awk執行對符合<pattern>該行後面的動作。

迷失的外觀{next;}是跳到輸入中下一行的默認動作。這似乎沒有必要,但我很久以前有這種習慣...

3

管道角色需要轉義,以便shell不會解釋它。一個簡單的辦法:

$ awk -F\| '{print $2}' file 

另一種選擇是引用字符:

$ awk -F'|' '{print $2}' file 
16

或者只是使用一個命令:

cut -d '|' -f FIELDNUMBER 
+0

請注意,問題的關鍵是管道字符,而不是使用的命令。但這是一個很好的解決方案。 – 2008-10-17 21:28:12

+0

我想過了,但我寧願有一個解釋問題的答案。事實上,這就是我評論的觀點。 ;-) – 2008-10-17 22:00:12

0

和 '文件' 不包含管道符號,所以它什麼都不打印。您應該使用'cat file'或者在awk程序之後直接列出文件。

相關問題