想让文件中的每一行重复固定次数。
例如,每行重复四次:
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 的语言一样,将其视为1
true。 (为了完整起见,如果省略条件,则将为每条记录执行该操作。)
许多 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