A変数の数が完了するまでB変数の値を繰り返す方法

A変数の数が完了するまでB変数の値を繰り返す方法

2つの変数値を含むファイルがあります。

# cat infile
A 1
B 2
C
D
E

$bにnull値がある場合は、すべての$a値を読み取るまで1..2のように繰り返すように変数aとbを読みたいと思います。

だからループを使うとecho $a $b

# cat loop.sh
#!/usr/bin/env bash

cat infile | while
  read a b
do
  echo $a $b
done

結果はinfileと多少同じです。

しかし、私は$ bを繰り返しエコーするようにするifステートメントが欲しいです。

A 1
B 2
C 1
D 2
E 1

ベストアンサー1

2 番目の列の値が足りなくなった場合、その列に値がなくなると仮定すると、

awk '{ if ($2 == "") $2 = saved[(i++)%n]; else saved[n++] = $2 }; 1' file

これは2番目の列の値をarrayとして読み込みsaved、インデックスは0最初の値を保持してn毎回増加します。 2番目の列の値が不足している場合は、この配列を使用してループ内の列を埋め、カウンタとしてi機能し、モジュロn演算子を使用してその値を倍数でゼロに折り返します。

テスト:

$ cat file
A 1
B 2
C
D
E
$ awk '{ if ($2 == "") $2 = saved[(i++)%n]; else saved[n++] = $2 }; 1' file
A 1
B 2
C 1
D 2
E 1
$ cat otherfile
A apple
B bumblebee
C sunshine
D
E
F
G
H
$ awk '{ if ($2 == "") $2 = saved[(i++)%n]; else saved[n++] = $2 }; 1' otherfile
A apple
B bumblebee
C sunshine
D apple
E bumblebee
F sunshine
G apple
H bumblebee

おすすめ記事