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