2011-08-02 98 views
4

看了很多帖子都問過類似的問題。無法讓它工作。在awk中解析管道分隔的輸入文件

輸入的樣子:

<field one with spaces>|<field two with spaces> 

試圖用awk來解析。

試過很多變種,從優秀的帖子:

FS = "^[\x00- ]*|[\x00- ]*[|][\x00- ]*|[\x00- ]*$"; 
FS = "^[\x00- ]*|[\x00- ]*\|[\x00- ]*|[\x00- ]*$"; 
FS = "^[\x00- ]*|[\x00- ]*\\|[\x00- ]*|[\x00- ]*$"; 

仍然無法獲得管道分隔符的工作。

使用CentOS。

任何幫助?

回答

14
echo "field one has spaces | field two has spaces" \ 
| awk ' 
    BEGIN { 
     FS="|" 
} 
{ 
    print $2 
    print $1 
    # or what ever you want 
}' 

#output 

    field two has spaces 
    field one has spaces 

還可以將此減少

awk -F'|' { 
    print $2 
    print $1 
}' 

編輯 此外,並非所有awks可以爲FS值多字符的正則表達式。

EDIT2 不知怎的,我錯過了這個原本,但我看你是想包括\x00在焦炭類預和|焦炭的職位。我假設你的意思是\x00 == null char?我不認爲你將能夠通過awk解析嵌入空字符的文件。你可以預習,處理你的輸入像

tr '\x00' ' ' <file.txt> spacesForNulls.txt 

或與

tr -d '\x00' <file.txt> deletedNulls.txt 

完全刪除它們,消除你的正則表達式的一部分。但是,如上所述,某些awk不支持FS值的正則表達式。 而且,我並不使用tr技巧,您可能會發現它需要一個null字符的略有不同的符號,具體取決於您的tr版本。

我希望這會有所幫助。

+0

帶'\ x00'的好點。或者應該使用更專門的工具,如'perl'或'ruby'。 ++ – sjsam

+0

'我不認爲你將能夠awk解析一個嵌入空字符的文件嗎?或者第二個想法? 'awk'{gsub(「\ x00」,「」)} 1'是可能的。 – sjsam