我有一个包含整数列表的文件:
12542
58696
78845
87855
...
我想将它们改成:
"12542", "58696", "78845", "87855", "..."
(最后没有逗号)
我相信我需要使用sed,但无法弄清楚如何。感谢您的帮助。
答案 0 :(得分:3)
这是解决方案,
sed 's/.*/ "&"/' input-file|tr '\n' ','|rev | cut -c 2- | rev|sed 's/^.//'
首先用引号
更改输入文本行sed 's/.*/ "&"/' input-file
然后,这会将您的新行转换为逗号
tr '\n' ',' <your-inputfile>
包括rev
,cut
和sed
在内的最后一个命令用于根据需要格式化输出。
其中,
rev
正在翻转字符串。
cut
正在从输出中删除尾随逗号。
sed
正在删除字符串中的第一个字符,以便相应地格式化它。
<强>输出:强>
答案 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没有任何管道/叉子:
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\""
通过将printf
与sep
连接,合成用于\"%s\"
的格式字符串。生成的格式字符串将应用于$0
,每个输入行。sep
仅在第一个输入记录之后初始化,因此,
实际上只在输出元素之间插入。