用逗号分隔多行(Perl / Sed / AWK)将多行转换为一行

时间:2013-04-02 07:48:57

标签: linux perl unix sed awk

我有以下几行数据:

foo
bar
qux
zuu
sdf
sdfasdf

我想要做的是用一行和逗号分隔来转换它们:

foo,bar,qux,zuu,sdf,sdfasdf

什么是最好的unix单线程呢?

8 个答案:

答案 0 :(得分:127)

使用粘贴命令:

paste -d, -s file

答案 1 :(得分:63)

文件

aaa
bbb
ccc
ddd

xargs的

cat file | xargs

结果

aaa bbb ccc ddd 

xargs改进了

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

结果

aaa,bbb,ccc,ddd 

答案 2 :(得分:10)

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

这是一种较短的方式。

答案 3 :(得分:9)

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

使用tr命令:

tr '\n' ',' < somefile

使用awk:

awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile

答案 4 :(得分: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

答案 5 :(得分:6)

Perl one-liner:

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

或者,如果你想更加神秘:

perl '-peeof||chomp&&s/$/,/' file

答案 6 :(得分:1)

perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file

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

答案 7 :(得分:1)

sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'