ファイルの各行が固定回数だけ繰り返されることを望みます。
たとえば、各行は4回繰り返されます。
a
b
c
になる:
a
a
a
a
b
b
b
b
c
c
c
c
いくつかの検索をしてみると、重複した行を単一の行にマージするなど、反対の操作に関連する多くの質問と回答があり、多分再印刷して行を2倍に増やすことに関する質問もありました。
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
は現在の行を印刷することです。デフォルトの動作は、次の行に移動する前に現在の行を印刷することです(これが-n
sedがそれをオフにするのを許可する理由です)。いくつかの古いsedにはセミコロンがなかったので(私の考えでは)、次のことを行う必要があるかもしれません。sed -e p -e p -e p
awkはペアで動作しますcondition {action}
。この操作を省略すると、デフォルトで条件が true を返すと、現在の行が印刷されます。 Awkは、多くのCシリーズ言語と同様に、これを1
事実として扱います。 (完全性のために条件を省略した場合は、レコードごとに演算を行います。)
多くの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