最初の列の数に基づいてファイル内の各行の数を印刷する方法

最初の列の数に基づいてファイル内の各行の数を印刷する方法
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入力ファイルを繰り返します。デフォルトの改行文字は行区切り文字です。入力ラインを印刷しない
  • -ePerlコードの実行
  • 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

関連情報