2017-05-04 113 views
1

我有一个文本文件中的以下列表:使用SED或AWK到双引号逗号分隔并连接列表

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" 

回答

3

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

  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 

With 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" 
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" 
1

这里是另一种选择

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

"10.1.2.200","10.1.2.201","10.1.2.202","10.1.2.203" 
-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"