web-dev-qa-db-ja.com

各行を複数回繰り返す

ファイル内の各行を一定の回数繰り返したい。

例えば各行を4回繰り返します。

a
b
c

になる:

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

私はいくつかの検索を行いましたが、逆を行うことに沿って多くの質問と回答があります。重複した行を1つの行にマージします。もう一度印刷して、行を2倍にすることもできます。

Cでこれを行うのは簡単ですが、ネイティブコマンドの詳細を知っていれば、このような1回限りのスローアウェイに常に頼る必要はありません。

20
Yimin Rong
  • 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
    
20
terdon

これが 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 $_;
}
34
glenn jackman
sed -n '{p;p;p;p;}' file

awk '{print;print;print;print;}' file
4
Hauke Laging

これはあなたのために働くかもしれません(GNU sed):

sed 'h;:a;s/[^\n]\+/&/4;t;G;ba' file

各行を4回繰り返します。

または、必要に応じて:

sed 'h;:a;s/\n/&/3;t;G;ba' file

各行を3回以上繰り返す場所。

1
potong

@potongの答えは空行では機能しません。\+*に置き換えると修正されます。

sed 'h;:a;s/[^\n]*/&/4;t;G;ba' file
1
Jan Kos

純粋にシェルを使用する:

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