我有包含 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