Unix 使用sed或awk双引号分隔并连接列表

Unix 使用sed或awk双引号分隔并连接列表,unix,awk,sed,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" 最简单的方法如下(在伪代码中): 读一行 把这行加引号 在堆栈或字符串中保留引用的行 在末尾(或构造字符串时),用逗号将行连接在一起 根据语

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

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"

最简单的方法如下(在伪代码中):

  • 读一行
  • 把这行加引号
  • 在堆栈或字符串中保留引用的行
  • 在末尾(或构造字符串时),用逗号将行连接在一起
  • 根据语言的不同,这相当简单:

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

    红宝石:

    应该适用于给定的示例

    用呆呆的眼神测试:

    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"
    

    这是另一种选择

    sed 's/.*/"&"/' file | paste -sd,
    
    "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
    
    awk -F'\n' -v RS="\0" -v OFS='","' -v q='"' '{NF--}$0=q$0q' file
    
    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"
    
    sed 's/.*/"&"/' file | paste -sd,
    
    "10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203"
    
    $ 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"