在awk中解析管道分隔输入

sco*_*ddy 5 awk parsing pipe delimited

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

输入看起来像:

<field one with spaces>|<field two with spaces>
Run Code Online (Sandbox Code Playgroud)

试着用awk解析.

从优秀的帖子尝试了很多变种:

FS = "^[\x00- ]*|[\x00- ]*[|][\x00- ]*|[\x00- ]*$";
FS = "^[\x00- ]*|[\x00- ]*\|[\x00- ]*|[\x00- ]*$";
FS = "^[\x00- ]*|[\x00- ]*\\|[\x00- ]*|[\x00- ]*$";
Run Code Online (Sandbox Code Playgroud)

仍然无法使管道分隔符工作.

使用CentOS.

有帮助吗?

she*_*ter 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
Run Code Online (Sandbox Code Playgroud)

你也可以减少这个

awk -F'|' {
    print $2
    print $1
}'
Run Code Online (Sandbox Code Playgroud)

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

Edit2 不知怎的,我最初错过了这个,但是我看到你正试图\x00在char前后的char类中加入|.我假设你的意思是\x00== nullchar?我不认为您将能够awk解析嵌入了空字符的文件.你可以准备好你的输入

 tr '\x00'   ' ' < file.txt > spacesForNulls.txt 
Run Code Online (Sandbox Code Playgroud)

或者完全删除它们

tr -d '\x00' < file.txt > deletedNulls.txt
Run Code Online (Sandbox Code Playgroud)

并消除你的正则表达式的那部分.但如上所述,有些awk人不支持正则表达式FS.并且,我不会tr非常使用这个技巧,你可能会发现它需要一个略有不同的表示法null,取决于你的版本tr.

我希望这有帮助.