我有一個由管道字符分隔的字段的文件,我只想打印第二個字段。此嘗試失敗:如何從管道分隔文件打印字段?
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
有沒有辦法做到這一點?
我有一個由管道字符分隔的字段的文件,我只想打印第二個字段。此嘗試失敗:如何從管道分隔文件打印字段?
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
有沒有辦法做到這一點?
這裏的關鍵是管道字符(|
)必須轉義到shell。使用「\|
」或「'|'
」來保護它免受外殼干擾,並允許它在命令行上傳遞到awk
。
閱讀中,我看到,原來的海報介紹其中涉及過濾file
選擇和打印領域之前的原始問題的簡化版本的意見。使用了通過grep
的傳遞,並將結果傳送到awk進行字段選擇。這說明問題中出現的完全不必要的cat file
(它取代了grep <pattern> file
)。
好的,這將工作。然而,awk在很大程度上是一種模式匹配工具,可以信任在匹配行中查找和工作,而無需調用grep
。使用類似:
awk -F\| '/<pattern>/{print $2;}{next;}' file
的/<pattern>/
位告訴awk
執行對符合<pattern>
該行後面的動作。
迷失的外觀{next;}
是跳到輸入中下一行的默認動作。這似乎沒有必要,但我很久以前有這種習慣...
管道角色需要轉義,以便shell不會解釋它。一個簡單的辦法:
$ awk -F\| '{print $2}' file
另一種選擇是引用字符:
$ awk -F'|' '{print $2}' file
或者只是使用一個命令:
cut -d '|' -f FIELDNUMBER
和 '文件' 不包含管道符號,所以它什麼都不打印。您應該使用'cat file'或者在awk程序之後直接列出文件。
請注意,問題的關鍵是管道字符,而不是使用的命令。但這是一個很好的解決方案。 – 2008-10-17 21:28:12
我想過了,但我寧願有一個解釋問題的答案。事實上,這就是我評論的觀點。 ;-) – 2008-10-17 22:00:12