如何将由一个空行分隔的两连续行打印为由“,”(逗号)分隔的一行

如何将由一个空行分隔的两连续行打印为由“,”(逗号)分隔的一行

怎样才能把文字转过来

St1
number1
1234

St2
number2
456

进入下一个?

st1,number1,1234
st2,number2,1234

答案1

随着标准paste命令

$ paste -sd ',,\n\0' file
St1,number1,1234
St2,number2,456

s连续的paste行, ,file,,新队,没有什么(不是人们可能认为的 NUL 字符)d依次作为分隔符。

或者:

$ paste -d ',,\0' - - - - < file
St1,number1,1234
St2,number2,456

pastes stdin 4 次,,没有什么作为d它们之间的分隔符。

答案2

Perl 方式:

$ perl -00 -ne 'print join(",",split(/\n/)) . "\n"; ' file
St1,number1,1234
St2,number2,456

打开-00Perl 的“段落模式”,其中“行”由 定义\n\n,因此每个段落都被视为单个“行”。意思-n是“逐行读取输入文件并将 给定的脚本应用到每一行。该脚本将在(换行符:行尾字符)-e上分割输入行,然后用 来连接结果元素。这都是沿着打印的带有尾随换行符。\n,

为了清楚起见,你可以写同样的东西:

$ perl -00 -ne '@fields=split(/\n/); $out=join(",",@fields); print "$out\n" ' file
St1,number1,1234
St2,number2,456

或者像这样,为了好玩:

$ perl -00 -pe '$_=join(",",split(/\n/))."\n";' file
St1,number1,1234
St2,number2,456

答案3

尝试awk

awk '$1=$1' OFS=, RS= file
St1,number1,1234
St2,number2,456

空记录分隔符的RS目标是“空白行”,并且分配一个字段(此处$1:)可以awk使用 重新组合字段中的整个记录OFS​​。它假定$1永远不会为 0 或 NULL/空。

答案4

在 Perl 中使用段落模式(-00):

perl -pals -F'\n' -00e 's/.*/@F/s' -- -\"=, file

Perl 逐行模式:

perl -pe '
  chomp($_.=<>.<>),tr/\n/,/ if/./;
  eof && s/.\K$/\n/;
' file

POSIXly sed :

sed '
  /./{H;$!d;}
  x;y/\n/,/;s/.//
' file

我们可以使用GNU csplit + xargs paste管道来做到这一点

csplit --suppress-matched -sz file '/^$/' '{*}'
printf '%s\n' xx* | xargs -r paste -sd,

使用Python 中模块groupby的方法itertools以及列表理解:


python3 -c 'import sys, itertools as it

ofs,(rs,ors) = ",","\n" * 2
g = lambda x: not len(x)
h = lambda x: x.rstrip(rs)

with open(sys.argv[1]) as f:
  print(*[ofs.join(igrp) for k,igrp in it.groupby(map(h,f),g) if not k],sep=ors)
' file

输出:-

St1,number1,1234
St2,number2,456

相关内容