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

nev*_*int 78 unix linux perl awk sed

我有多行以下数据:

foo
bar
qux
zuu
sdf
sdfasdf
Run Code Online (Sandbox Code Playgroud)

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

foo,bar,qux,zuu,sdf,sdfasdf
Run Code Online (Sandbox Code Playgroud)

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

Gur*_*uru 135

使用粘贴命令:

paste -d, -s file
Run Code Online (Sandbox Code Playgroud)

  • 但是如何为变量或管道实现这一目标?更新自己:使用-s没有价值.... | 粘贴-d,-s (8认同)
  • @NeoMorfeo您也可以使用`-`来读取管道.例如:`echo -e"1 \n2 \n3"| 粘贴-d,-s -` (4认同)
  • paste是一个很棒的命令.像冠军一样工作! (3认同)
  • 虽然这适用于想要将换行符(`\n`)转换为逗号的情况,但如果需要将换行符转换为许多其他命令所需的"`,`",则似乎无法使用此方法. (2认同)

小智 65

文件

aaa
bbb
ccc
ddd
Run Code Online (Sandbox Code Playgroud)

xargs的

cat file | xargs
Run Code Online (Sandbox Code Playgroud)

结果

aaa bbb ccc ddd 
Run Code Online (Sandbox Code Playgroud)

xargs改进了

cat file | xargs | sed -e 's/ /,/g'
Run Code Online (Sandbox Code Playgroud)

结果

aaa,bbb,ccc,ddd 
Run Code Online (Sandbox Code Playgroud)


小智 10

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

这是更短的方式

  • 除非你的行中有空格...... (2认同)

n3r*_*rV3 9

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

使用tr命令:

tr '\n' ',' < somefile
Run Code Online (Sandbox Code Playgroud)

使用awk:

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

  • 永远不要使用`printf $ 0`,因为如果$ 0包含任何printf格式字符,它将会加密失败.printf的概要是`printf格式,数据`所以使用`printf"%s",而不是$ 0`. (13认同)
  • `awk'{printf NR == 1?$ 0:","$ 0}'file` (2认同)

Ken*_*ent 7

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

awk -vRS="" -vOFS=',' '$1=$1' file
Run Code Online (Sandbox Code Playgroud)

测试:

kent$  echo "foo
bar
qux
zuu
sdf
sdfasdf"|awk -vRS="" -vOFS=',' '$1=$1' 
foo,bar,qux,zuu,sdf,sdfasdf
Run Code Online (Sandbox Code Playgroud)

  • 为了清楚起见并避免在以后尝试在BEGIN块中使用变量时感到惊讶,除非在文件之间将变量设置为不同的值,否则我总是使用-v.FYI省略-v和变量名之间的空格使得你的脚本不一定特定于gawk,所以我使用`-v RS =`而不是`-vRS =`. (3认同)

cho*_*oba 6

Perl单线:

perl -pe'chomp, s/$/,/ unless eof' file
Run Code Online (Sandbox Code Playgroud)

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

perl '-peeof||chomp&&s/$/,/' file
Run Code Online (Sandbox Code Playgroud)

  • 更加神秘:`perl'-peeof || s | $/$ |,|' file` (5认同)