【问题标题】:How to insert a different delimiter in between two columns in shell如何在 shell 的两列之间插入不同的分隔符
【发布时间】:2014-01-29 12:06:52
【问题描述】:

我有一个文件如下

ABc def|0|0|0| 1 | 2| 9|
0 2930|0|0|0|0| 1 | 2| 9|

现在,我想用相同的分隔符分割第一列。

输出:

ABc|def|0|0|0| 1 | 2| 9|
0|2930|0|0|0|0| 1 | 2| 9|

请帮我解决一下 awk。

【问题讨论】:

    标签: shell sed awk


    【解决方案1】:

    您可以为此使用sed

    $ sed 's/ /|/' file
    ABc|def|0|0|0| 1 | 2| 9|
    0|2930|0|0|0|0| 1 | 2| 9|
    

    它的定义方式,只是将第一个空格替换为|,这正是你所需要的。

    awk 会更长一点:

    $ $ awk 'BEGIN{FS=OFS="|"}{split($1, a, " "); $1=a[1]"|"a[2]}1' file
    ABc|def|0|0|0| 1 | 2| 9|
    0|2930|0|0|0|0| 1 | 2| 9|
    

    定义输入和输出字段分隔符为|后,它会根据空格分割第一个字段。然后将行打印回来。

    【讨论】:

    • Sed 给我:| ABc def|0|0|0| 1 | 2| 9| 第一行。
    • 我猜你复制粘贴了前导空格。我看到原来的帖子有,我猜错了。
    • 2930 在你的awk 中去了哪里;)
    【解决方案2】:

    另一个awk

    awk '{sub(/ /,"|")}1' file
    ABc|def|0|0|0| 1 | 2| 9|
    0|2930|0|0|0|0| 1 | 2| 9|
    

    没有前导空格,这可以正常工作。

    【讨论】:

      【解决方案3】:

      您说要替换 first 列中的分隔符(空格->竖线)。

      您的第一个列中可能没有空格,但在其他列中,有空格。在这种情况下,您不想对该行进行任何更改。同样在您的第一列中,可能会有更多空格,我想您希望将它们全部替换。所以我想不出一个更短的方法来解决这个问题。

      awk -F'|' -v OFS="|" '{gsub(/ /,"|",$1)}7' file
      

      【讨论】:

        【解决方案4】:
        sed 's/^[[:blank:]]\{1,\}/  /;/^\([^|]\{1,\}\)[[:blank:]]\{1,\}\([^|[[:blank:]]\)/ s//\1|\2/'
        

        假设第一列是空白为空,一个空白(或多个)作为分隔符而不是另一个非空白或| 这允许这个

        ABc def|0|0|0| 1 | 2| 9|
         def|0|0|0| 1 | 2| 9|
        ABc|def|0|0|0| 1 | 2| 9|
        

        【讨论】:

        • 如果不理解为什么,至少添加评论,谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-11
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        相关资源
        最近更新 更多