怎样才能把文字转过来
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
paste
s stdin 4 次,
,,
并没有什么作为d
它们之间的分隔符。
答案2
Perl 方式:
$ perl -00 -ne 'print join(",",split(/\n/)) . "\n"; ' file
St1,number1,1234
St2,number2,456
打开-00
Perl 的“段落模式”,其中“行”由 定义\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