每行重复多次

每行重复多次

想让文件中的每一行重复固定次数。

例如,每行重复四次:

a
b
c

变成:

a
a
a
a
b
b
b
b
c
c
c
c

我做了一些搜索,并且有很多与相反操作相关的问题和答案,例如将重复的行合并为单行,也许还有一些关于通过再次打印来加倍行。

在 C 语言中做到这一点很容易,但我希望我能更多地了解本机命令,这样我就不必一直求助于这些一次性的命令。

答案1

我想知道这是否会变成高尔夫球匹配:

sed 'p;p;p' 
awk '1;1;1;1' 
perl -lpE 'say;say;say'   # if Paul McCartney and Michael Jackson were hackers...

解释:

sed 的p命令是打印当前行。默认行为是在移动到下一行之前打印当前行(这就是 sed 必须-n允许您将其关闭的原因)。一些较旧的 sed 没有分号(我认为),所以您可能必须这样做sed -e p -e p -e p

awk 成对工作condition {action}。如果省略该操作,则默认情况下,如果条件返回 true,则打印当前行。 Awk 与许多类似 C 的语言一样,将其视为1true。 (为了完整起见,如果省略条件,则将为每条记录执行该操作。)

许多 Perl 函数都利用“默认”变量。这一行代码相当于(在 perl 5.16 上):

$ perl -MO=Deparse -lpE 'say;say;say'
BEGIN { $/ = "\n"; $\ = "\n"; }
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    say $_;
    say $_;
    say $_;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

答案2

  • 珀尔:

    perl -ne 'for$i(0..3){print}' file
    

    我必须将这个添加为评论作者:@derobert,因为它很酷:

    perl -ne 'print "$_" x4'
    
  • awk和变体:

    awk '{for(i=0;i<4;i++)print}' file
    
  • bash

    while read line; do for i in {1..4}; do echo "$line"; done; done < file
    

答案3

sed -n '{p;p;p;p;}' file

awk '{print;print;print;print;}' file

答案4

使用纯外壳:

repeats=4
while read line; do yes $line|head --lines=$repeats; done < infile > outfile

相关内容