在awk中解析管道分隔输入

时间:2011-08-02 19:56:05

标签: parsing awk pipe delimited

看过很多帖子都提出类似的问题。无法让它发挥作用。

输入看起来像:

<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。

任何帮助?

1 个答案:

答案 0 :(得分:15)

 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版本。

我希望这会有所帮助。