5

看过很多帖子问类似的问题。不能让它工作。

输入看起来像:

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

有什么帮助吗?

4

1 回答 1

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
}'

编辑 此外,并非所有 awk 都可以为该值采用多字符正则表达式FS

Edit2 不知何故,我最初错过了这个,但我看到你正试图\x00在 char 的前后包含在 char 类中|。我假设您的意思是\x00== nullchar?我认为您将无法awk解析嵌入了空字符的文件。您可以预处理您的输入,例如

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

或完全删除它们

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

并消除你的正则表达式的那部分。但如上所述,有些awk不支持FS值的正则表达式。而且,我不太使用这个tr技巧,你可能会发现它需要一个稍微不同的null字符表示法,这取决于你的tr.

我希望这有帮助。

于 2011-08-02T20:00:26.283 回答