使用sed或awk双引号逗号分隔并连接一个列表

时间:2017-05-04 15:15:39

标签: unix awk sed

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

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"

4 个答案:

答案 0 :(得分:3)

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

  1. 读一行;
  2. 将该行放在引号中;
  3. 将引用的行保留在堆栈或字符串中;
  4. 最后(或构建字符串时),用逗号连接这些行。
  5. 根据语言的不同,这很简单:

    使用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"
    

答案 1 :(得分:1)

这是另一种选择

sed 's/.*/"&"/' file | paste -sd,

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

答案 2 :(得分:0)

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"

答案 3 :(得分:-2)

$ 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"