【发布时间】: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"
【问题讨论】:
我在一个文本文件中有以下列表:
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:
$ 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"
【讨论】:
这是另一种选择
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
应该适用于给定的示例。
用 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"
【讨论】:
$ 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"
【讨论】: