1行に複数回繰り返す

1行に複数回繰り返す

ファイルの各行が固定回数だけ繰り返されることを望みます。

たとえば、各行は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は現在の行を印刷することです。デフォルトの動作は、次の行に移動する前に現在の行を印刷することです(これが-nsedがそれをオフにするのを許可する理由です)。いくつかの古い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

関連情報