【问题标题】:using sed or awk to double quote comma separate and concatenate a list使用 sed 或 awk 双引号逗号分隔并连接列表
【发布时间】:2017-05-05 06:20:31
【问题描述】:

我在一个文本文件中有以下列表:

10.1.2.200
10.1.2.201
10.1.2.202
10.1.2.203

我想用“双引号”括起来,用逗号分隔并将值连接为一个字符串。

这可以在 sed 或 awk 中完成吗?

预期输出:

"10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203","10.1.2.204"

【问题讨论】:

    标签: unix awk sed


    【解决方案1】:

    最简单的是这样的(在伪代码中):

    1. 读一行;
    2. 将行放在引号中;
    3. 将引用的行保留在堆栈或字符串中;
    4. 在结尾处(或在构造字符串时),用逗号将各行连接在一起。

    根据语言,这相当简单:

    与awk:

    $ awk 'BEGIN{OFS=","}{s=s ? s OFS "\"" $1 "\"" : "\"" $1 "\""} END{print s}' file
    "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
    

    或者,用更少的“引号墙”来定义引号字符:

    $ awk 'BEGIN{OFS=",";q="\""}{s=s ? s OFS q$1q : q$1q} END{print s}' file
    

    sed:

    $ sed -E 's/^(.*)$/"\1"/' file | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/,/g'
    "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
    

    (在 Perl 和 Ruby 中,使用 join 函数,将元素压入堆栈然后加入堆栈是最简单的。)

    Perl:

    $ perl -lne 'push @a, "\"$_\""; END{print join(",", @a)}' file
    "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
    

    鲁比:

    $ ruby -ne 'BEGIN{@arr=[]}; @arr.push "\"#{$_.chomp}\""; END{puts @arr.join(",")}' file
    "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
    

    【讨论】:

      【解决方案2】:

      这是另一种选择

      sed 's/.*/"&"/' file | paste -sd,
      
      "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
      

      【讨论】:

        【解决方案3】:
        awk -F'\n' -v RS="\0" -v OFS='","' -v q='"' '{NF--}$0=q$0q' file
        

        应该适用于给定的示例。

        用 gawk 测试:

        kent$  cat f
        10.1.2.200
        10.1.2.201
        10.1.2.202
        10.1.2.203
        
        kent$  awk -F'\n' -v RS="\0" -v OFS='","' -v q='"' '{NF--}$0=q$0q' f
        "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
        

        【讨论】:

          【解决方案4】:
          $ awk '{o=o (NR>1?",":"") "\""$0"\""} END{print o}' file
          "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-10-24
            • 2017-08-13
            • 2016-07-03
            • 1970-01-01
            • 1970-01-01
            • 2021-09-05
            • 1970-01-01
            • 2013-07-03
            相关资源
            最近更新 更多