【问题标题】:Parsing pipe delimited input in awk在awk中解析管道分隔的输入
【发布时间】:2011-10-18 13:40:24
【问题描述】:

看过很多帖子都问过类似的问题。无法正常工作。

输入看起来像:

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

有什么帮助吗?

【问题讨论】:

    标签: parsing awk pipe delimited


    【解决方案1】:
     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 值采用多字符正则表达式。

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

    一样预处理您的输入
     tr '\x00'   ' ' < file.txt > spacesForNulls.txt 
    

    或者用

    完全删除它们
    tr -d '\x00' < file.txt > deletedNulls.txt
    

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

    我希望这会有所帮助。

    【讨论】:

    • \x00 的好点子。或者操作应该使用更专业的工具,如perlruby。 ++
    • I don't think you're going to be able to have awk parse a file with null chars embedded 或者再想一想? awk '{gsub("\x00","")}1 是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2020-03-01
    相关资源
    最近更新 更多