ファイル内の各行を一定の回数繰り返したい。
例えば各行を4回繰り返します。
a
b
c
になる:
a
a
a
a
b
b
b
b
c
c
c
c
私はいくつかの検索を行いましたが、逆を行うことに沿って多くの質問と回答があります。重複した行を1つの行にマージします。もう一度印刷して、行を2倍にすることもできます。
Cでこれを行うのは簡単ですが、ネイティブコマンドの詳細を知っていれば、このような1回限りのスローアウェイに常に頼る必要はありません。
Perl:
Perl -ne 'for$i(0..3){print}' file
そして、これは@derobertによって comment として投稿されたものを追加する必要があります。
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
これが golf マッチになるかどうか疑問に思います。
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 $_;
}
sed -n '{p;p;p;p;}' file
awk '{print;print;print;print;}' file
これはあなたのために働くかもしれません(GNU sed):
sed 'h;:a;s/[^\n]\+/&/4;t;G;ba' file
各行を4回繰り返します。
または、必要に応じて:
sed 'h;:a;s/\n/&/3;t;G;ba' file
各行を3回以上繰り返す場所。
@potongの答えは空行では機能しません。\+
を*
に置き換えると修正されます。
sed 'h;:a;s/[^\n]*/&/4;t;G;ba' file
純粋にシェルを使用する:
repeats=4
while read line; do yes $line|head --lines=$repeats; done < infile > outfile