![如何重复B变量的值直到A变量的数量完成](https://linux22.com/image/194943/%E5%A6%82%E4%BD%95%E9%87%8D%E5%A4%8DB%E5%8F%98%E9%87%8F%E7%9A%84%E5%80%BC%E7%9B%B4%E5%88%B0A%E5%8F%98%E9%87%8F%E7%9A%84%E6%95%B0%E9%87%8F%E5%AE%8C%E6%88%90.png)
我有包含 2 个变量值的 infile
# cat infile
A 1
B 2
C
D
E
我想读取变量 a 和 b,这样如果 $b 具有空值,它应该像 1..2 一样重复,直到读取所有 $a 值。
所以如果我使用一个循环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
假设一旦第二列用完值,该列中将不再有值,
awk '{ if ($2 == "") $2 = saved[(i++)%n]; else saved[n++] = $2 }; 1' file
这会将第二列的值读入数组saved
,索引0
保存第一个值并n
每次递增。当第二列用完值时,该数组用于以循环方式填充该列,用作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