添加双引号,逗号和删除换行符

时间:2014-12-23 09:03:46

标签: linux bash perl awk sed

我有一个包含整数列表的文件:

12542
58696
78845
87855
...

我想将它们改成:

"12542", "58696", "78845", "87855", "..."

(最后没有逗号)

我相信我需要使用sed,但无法弄清楚如何。感谢您的帮助。

7 个答案:

答案 0 :(得分:3)

这是解决方案,

sed 's/.*/ "&"/' input-file|tr '\n' ','|rev | cut -c 2- | rev|sed 's/^.//'

首先用引号

更改输入文本行
sed 's/.*/ "&"/' input-file

然后,这会将您的新行转换为逗号

tr '\n' ',' <your-inputfile>

包括revcutsed在内的最后一个命令用于根据需要格式化输出。

其中,

rev正在翻转字符串。

cut正在从输出中删除尾随逗号。

sed正在删除字符串中的第一个字符,以便相应地格式化它。

<强>输出:

enter image description here

答案 1 :(得分:3)

你可以做一个sed多线技巧,但简单的方法就是利用shell扩展:

echo $(sed '$ ! s/.*/"&",/; $ s/.*/"&"/' foo.txt)

运行echo $(cat file)以查看其工作原理。简而言之,诀窍是将cat的结果解析为标记,并将其解释为echo的单个参数,并以空格分隔打印它们。

sed表达式读取

$ ! s/.*/"&",/
$ s/.*/"&"/

...表示:对于除最后一行($ !之外的所有行),请使用"line",替换该行,并使用"line"替换最后一行。

编辑:如果文件不仅包含像OP一样的整数行(当文件可以包含shell展开的字符时),则以下工作:

EDIT2:一般案例的更好代码。

sed -n 's/.*/"&"/; $! s/$/,/; 1 h; 1 ! H; $ { x; s/\n/ /g; p; }' foo.txt

说明:以更易读的方式编写,sed脚本是

s/.*/"&"/
$! s/$/,/
1 h
1! H
$ {
  x
  s/\n/ /g
  p
}

这意味着:

s/.*/"&"/

用双引号包裹每一行。

$! s/$/,/

如果不是最后一行,请附加逗号

1 h
1! H

如果是第一行,则用前一个转换的结果覆盖保持缓冲区,否则将其附加到保持缓冲区。

$ {
  x
  s/\n/ /g
  p
}

如果它是最后一行 - 此时保持缓冲区包含用双引号括起来的整行,在适当的地方用逗号分隔 - 用模式空间交换保持缓冲区,用空格替换换行符,然后打印结果。

答案 2 :(得分:2)

没有任何管道/叉子:

perl -0ne 'print join(", ", map { "\042$_\042" } split), "\n"' file

输出:

"12542", "58696", "78845", "87855"

答案 3 :(得分:2)

这是一个纯Bash(Bash≥4)的可能性,可以读取内存中的整个文件,所以对大文件不好:

mapfile -t ary < file
((${#ary[@]})) && printf '"%s"' "${ary[0]}"
((${#ary[@]}>1)) && printf ', "%s"' "${ary[@]:1}"
printf '\n'

对于大文件,这个awk似乎没问题(并且会相当快):

awk '{if(NR>1) printf ", ";printf("\"%s\"",$0)} END {print ""}' file

答案 4 :(得分:1)

您可以在一行中编写面向列的值,但不能使用逗号,如下所示:

cnt=0
while read -r line || test -n "$line" ; do
    [ "$cnt" = "0" ] && printf "\"%s\"" "$line"
    printf ", \"%s\"" "$line"
    cnt=$((cnt + 1))
done
printf "\n"

<强>输出:

$ bash col2row.sh dat/ncol.txt
 "12542", "12542", "58696", "78845", "87855"

答案 5 :(得分:1)

单向,使用sed

sed ':a; N; $!ba; s/\n/", "/g; s/.*/"&"/' file

结果:

"12542", "58696", "78845", "87855", "..."

答案 6 :(得分:1)

简化的awk解决方案:

awk '{ printf sep "\"%s\"", $0; sep=", " }' file
  • 利用未初始化的变量默认为字符串上下文中的空字符串(sep)。
  • sep "\"%s\""通过将printfsep连接,合成用于\"%s\"的格式字符串。生成的格式字符串将应用于$0,每个输入行。
  • 由于sep仅在第一个输入记录之后初始化,因此,实际上只在输出元素之间插入