web-dev-qa-db-ja.com

テキスト内の各行をn回繰り返します

このようなファイルがあります

888
924
873
1374
.....

ドットは、さらに多くの文字列(約3000)があることを示しています。各文字列をn回繰り返して、このようなものにする必要があります。

888
888
888
924
924
924
873
873
873
....

私は小さなbashコードを書こうとしました:

#! bin/bash

while IFS= read -r line

do 
    awk 'NR==line'
    awk 'NR==line'
    awk 'NR==line'
done < /<PATH_TO_FILE>

しかし、結果は得られません。これは非常に簡単な作業だと思いましたが、明らかに何かが欠けています。何かアドバイスはありますか?

2
efrem

Perlで簡単に実行できます:

Perl -ne 'print $_ x 3' file

上記のoneliner出力:

$ Perl -ne 'print $_ x 3' file
888
888
888
924
924
924
873
873
873
1374
1374
1374

ニーズに合わせてサンプル値を変更するだけです。

awkソリューション:

awk '{for (i = 1; i <= 3; i++) print $1}' file

Bashスクリプトを修正するには、代わりに次のスニペットを使用します。

#!/bin/bash

while read line
do
    for i in {1..3}; do echo $line; done
done < ./file
4
Sylvain Pineau

文字列を繰り返し印刷するいい方法があります:

$ printf "%0.s-" {1..10}
----------

それに基づいて、ファイルをループし、中括弧式で指定した回数だけ行を出力できます。

while IFS= read -r line
do
printf "%0.s$line\n" {1..3}
done < file

テスト

                          change this number as you wish
                                                       v
$ while IFS= read -r line; do printf "%0.s$line\n" {1..3}; done < a
888
888
888
924
924
924
873
873
873
1374
1374
1374

私の好みは、このようなawkを使用することですが、他の人が以前に投稿したものと非常によく似ています(ちなみにいい答えです):

awk -v tot=3 '{for (i=1; i<=tot; i++) print}' file
2
fedorqui

これは、sedを介して簡単に実行できます。

$ sed 's/\(.*\)/\1\n\1\n\1/g' file
888
888
888
924
924
924
873
873
873
1374
1374
1374
1
Avinash Raj