テキストを繰り返すには?

テキストを繰り返すには?

awkテキストを100回繰り返すには?

つまり

string1
string2
string3

になります:

string1
string2
string3
string1
string2
string3
string1
string2
string3...

答え1

この質問にはタグ付けされていますが、awk以下を使用しない簡単な解決策を追加したいと思いますawk

seq 100 | xargs -n1 -I{} echo "1 2 3"

繰り返したいデータがファイルにある場合は、次を使用してください。

seq 100 | xargs -n1 -I{} cat filename

yes別の解決策は、引数を繰り返すコマンドを使用することです。

yes "1 2 3" | head -n100

答え2

input繰り返すテキストを含むファイル)

GNUの使用awk(そして入力にNULバイトが含まれていないと仮定):

awk -v n=100 -v RS='\0' -v ORS= '{while (n--) print}' < input

持ち運べる:

awk -v n=100 -v ORS= '
  {all = all $0 RS}
  END {while (n--) print all}' < input

(入力が改行文字で終わらない場合は改行文字が追加されます。)

次のこともできます。

set --
n=100; while [ "$n" -gt 0 ]; do
  set -- "$@" input
  n=$((n - 1))
done
cat "$@"

inputこれは含まれているバイトに関係なく機能します。ただし、の値が大きく、シェルにコマンドが組み込まれていない場合は、nコマンド引数のサイズに対するシステム制限(ここ)に達する可能性があります。catcat

または、最新バージョンを使用すると、zsh固定テキストに対して次のことができます。bashksh93yash -o braceexpand

printf '%.0sstring1\nstring2\nstring3\n' {1..100}

そしてzsh

repeat 100 print -l string{1..3}

明らかに言えば、seqGNUがインストールされているシステムでは、次のようにすることもできます。

seq -f 'string1
string2
string%.0g' 3.0001 0.0001 3.0100

答え3

そしてawk

echo "t1 t2 t3" | awk '{l=$0; for(i=1;i++<100;) l=l" "$0} END{print l}'

そしてperl

echo "t1 t2 t3" | perl -ne 'chomp;print "$_ " x 100;'

答え4

では、/bin/bashファイルレコードの3つの値をn回連続して印刷できるように、印刷レコードをパラメータ化できます。連続する必要はありません。

入力ファイルからレコード2、3、6を印刷するとします。inputfile

$ cat inputfile
A
B
C
D
E
F
$ awk -v RS='\n' '{if(NR=="2"||NR=="3"||NR=="6") a[NR]=$0} \
END{for(i=1;i++<=100;) {print a[2]"\n"a[3]"\n"a[6];}}' inputfile

確かに、これは呼び出される配列のために少しコストがかかります。

関連情報