Input_file:
1 string1
4 string2
2 string3
...
Output_file:
1 string1
4 string2
4 string2
4 string2
4 string2
2 string3
2 string3
...
これは私のコードですが、うまくいきません。
#!/bin/bash
N=0
cat input_file | while read LINE; do
N=$((N+1))
awk '{for(i=0;i<'$1';i++);print}' $LINE >> output_file
done
答え1
awk '{for(i=0;i<$1;i++) print}' input_file > output_file
これはinput_file
各行にあります。i
最初のフィールドに基づいて繰り返し、現在の行を複数回印刷します。これにより、出力全体がにリダイレクトされますoutput_file
。
答え2
そしてperl
$ cat ip.txt
1 string1
4 string2
2 string3
$ perl -ane 'print $_ x $F[0]' ip.txt
1 string1
4 string2
4 string2
4 string2
4 string2
2 string3
2 string3
-a
入力行をスペースに分割して@F
配列に保存するオプション-n
入力ファイルを繰り返します。デフォルトの改行文字は行区切り文字です。入力ラインを印刷しない-e
Perlコードの実行print $_ x $F[0]
$_
入力行の最初のフィールドを指定された回数繰り返す明示的な印刷$F[0]
答え3
perl -pae '$_ = $_ x $F[0]' input_file
perl -nae 'print while $F[0]--' inputfile
perl -pae 's/^.*\n\K/$`/m while --$F[0]' inputfile
while IFS= read -r l; do yes "$l" | head -n "${l%%[!0-9]*}"; done < inputfile
while IFS= read -r l; do csh -c "repeat ${l%%[!0-9]*} echo '$l'"; done < inputfile
while IFS= read -r l; do
for k in $(seq "${l%%[!0-9]*}"); do echo "$l"; done
done < inputfile