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 $_;
}

おすすめ記事