95

我在多行中有以下数据:

foo
bar
qux
zuu
sdf
sdfasdf

我想要做的是将它们转换为一个逗号分隔的行:

foo,bar,qux,zuu,sdf,sdfasdf

什么是最好的unix单线做到这一点?

4

8 回答 8

169

使用粘贴命令:

paste -d, -s file
于 2013-04-02T08:04:09.940 回答
82

文件

aaa
bbb
ccc
ddd

xargs

cat file | xargs

结果

aaa bbb ccc ddd 

xargs 改进

cat file | xargs | sed -e 's/ /,/g'

结果

aaa,bbb,ccc,ddd 
于 2013-07-20T06:47:20.930 回答
11

有很多方法可以实现。您使用的工具主要取决于您自己的偏好或经验。

使用 tr 命令:

tr '\n' ',' < somefile

使用 awk:

awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile
于 2013-04-02T08:14:33.123 回答
10

xargs -a your_file | sed 's/ /,/g'

这是一种较短的方式。

于 2013-08-24T14:23:21.790 回答
7

根据您的输入示例,此 awk 行有效。(没有尾随逗号)

awk -vRS="" -vOFS=',' '$1=$1' file

测试:

kent$  echo "foo
bar
qux
zuu
sdf
sdfasdf"|awk -vRS="" -vOFS=',' '$1=$1' 
foo,bar,qux,zuu,sdf,sdfasdf
于 2013-04-02T08:20:27.683 回答
6

Perl 单行:

perl -pe'chomp, s/$/,/ unless eof' file

或者,如果你想更神秘:

perl '-peeof||chomp&&s/$/,/' file
于 2013-04-02T08:15:20.383 回答
2
sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'
于 2013-05-29T18:38:18.680 回答
1
perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file

这将创建一个扩展名为 .bak 的原始文件的备份,然后修改原始文件

于 2013-04-02T10:19:12.317 回答