【问题标题】:Pipe is not recognised when in a multi-character delimiter在多字符分隔符中时无法识别管道
【发布时间】:2020-09-23 08:15:46
【问题描述】:

我有一个用|;| 分隔的文件。 示例;

1|;|2|;|3|;|4|;|5
1|;|2|;|3|;|4|;|5

我需要把分隔符改成:或者别的,

awk 中的FS 对管道| 没有任何作用

awk '$1=$1' FS="|;|" OFS=":" file

1|:|2|:|3|:|4|:|5
1|:|2|:|3|:|4|:|5 

管道|在用作单字符分隔符时被识别;

awk '$1=$1' FS="|" OFS="" file

1:2:3:4:5
1:2:3:4:5 

不过,sed 解决了这个问题,

sed 's/|;|/:/g' file

但我想知道是否有办法使用awk 命令。

【问题讨论】:

    标签: linux unix pipe delimiter separator


    【解决方案1】:

    FS 包含一个正则表达式,| 表示正则表达式中的 alternative。反斜杠以匹配它们的字面意思:

    awk '$1=$1' FS='\\|;\\|' OFS=:
    

    单管道起作用的原因是单字符FS被特殊处理:

    如果 FS 是单个字符,则字段由该字符分隔。如果 FS 是空字符串,那么每个单独的字符将成为一个单独的字段。否则,FS 应该是一个完整的正则表达式。在 FS 是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符分隔。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2020-04-25
      相关资源
      最近更新 更多