2011-08-02 60 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