如何组合奇数和偶数行?

ery*_*ery 5 bash perl awk sed

我想将每个偶数行与其上方的行组合.就像是:

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中实现?

Kar*_*ath 11

在这里,用sed:

sed '$!N;s/\n/,/'
Run Code Online (Sandbox Code Playgroud)

和awk:

awk '{if (e) {print p","$0;} else {p=$0;} e=!e;}'
Run Code Online (Sandbox Code Playgroud)

要么

awk 'NR%2==0 {print p","$0;} NR%2 {p=$0;}'
Run Code Online (Sandbox Code Playgroud)

  • 甚至比'perl -pe'$ | - || s还要短!$ /!,!'`! (3认同)
  • @mob,`$.%2 &&`和`$ | - ||'一样短,但不那么特别. (3认同)

gle*_*man 5

这是paste命令的用途:

process_to_produce_output | paste -d, - -
Run Code Online (Sandbox Code Playgroud)

例:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • `paste` 将文件行合并在一起,使用默认的 TAB 分隔符。如果您将 `-` 指定为文件,它会将其解释为 STDIN。所以`paste -d, - -` 表示:合并来自 STDIN 和 STDIN 的行,使用 `,` 作为分隔符而不是 TAB。如果你使用`paste -d, - - -`,它将每3行连接在一起,`- - - -`将每4行连接在一起,依此类推。 (3认同)

Sin*_*nür 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
Run Code Online (Sandbox Code Playgroud)

输出:

C:\Temp> tt
第一行,csv,csv,csv,第二行,csv,csv
第三行,csv,csv,csv,csv,第四行,csv