我想将每个偶数行与其上方的行组合。类似的东西:
Line one,csv,csv,csv Line two,csv,csv Line three,csv,csv,csv,csv Line four,csv
结果应如下所示:
Line one,csv,csv,csv,Line two,csv,csv Line three,csv,csv,csv,csv,Line four,csv
任何想法如何在Perl或sed / awk中实现?
答案 0 :(得分:11)
这里是sed:
sed '$!N;s/\n/,/'
和awk:
awk '{if (e) {print p","$0;} else {p=$0;} e=!e;}'
或
awk 'NR%2==0 {print p","$0;} NR%2 {p=$0;}'
答案 1 :(得分:5)
这是paste
命令的用途:
process_to_produce_output | paste -d, - -
示例:
$ paste -d, - - <<END
> Line one,csv,csv,csv
> Line two,csv,csv
> Line three,csv,csv,csv,csv
> Line four,csv
> END
Line one,csv,csv,csv,Line two,csv,csv
Line three,csv,csv,csv,csv,Line four,csv
答案 2 :(得分:2)
Perl的内置变量$.会告诉你行号。如果$. % 2
为奇数,则1
为$.
,否则为0
。这是一个独立的例子;
#!/usr/bin/perl
use strict; use warnings;
my $buffer;
while (my $line = <DATA>) {
if ($. % 2) {
chomp $line;
$buffer = $line;
}
else {
print join(",", $buffer, $line);
}
}
__DATA__
Line one,csv,csv,csv
Line two,csv,csv
Line three,csv,csv,csv,csv
Line four,csv
输出:
C:\Temp> tt Line one,csv,csv,csv,Line two,csv,csv Line three,csv,csv,csv,csv,Line four,csv
答案 3 :(得分:2)
通常情况下,您需要在缓冲区中累积数据,直到您有足够的知识输出,然后输出数据。
my @buf;
while (<>) {
chomp;
if (!@buf) {
push @buf, $_;
next;
}
my $line1 = shift(@buf);
my $line2 = $_;
print("$line1,$line2\n");
}
但在这种情况下,存在一个更简单的解决方案,因为您的问题可以重述为:用逗号替换每一个换行符,从第一个开始。
perl -pe's/\n/,/ if $. % 2' file
答案 4 :(得分:1)
你不需要像perl / sed / awk那样的核武器来解决这个问题。
xargs
就足够了。
xargs -d '\n' -n2
<强>测试强>
kent$ echo "Line one,csv,csv,csv
Line two,csv,csv
Line three,csv,csv,csv,csv
Line four,csv"|xargs -d '\n' -n2
Line one,csv,csv,csv Line two,csv,csv
Line three,csv,csv,csv,csv Line four,csv
答案 5 :(得分:1)
还有一个:
awk -F, ORS=NR%2\?FS:RS infile
你不需要引用?大多数 shell 。
答案 6 :(得分:1)
一个稍微简单的Perl解决方案。
#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
chomp;
print "$_," . <DATA>;
}
__DATA__
Line one,csv,csv,csv
Line two,csv,csv
Line three,csv,csv,csv,csv
Line four,csv