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
두 번째 열의 값이 부족해지면 해당 열에는 더 이상 값이 없을 것이라고 가정하면,
awk '{ if ($2 == "") $2 = saved[(i++)%n]; else saved[n++] = $2 }; 1' file
이는 두 번째 열의 값을 array 로 읽어 들이고 saved
, 인덱스는 0
첫 번째 값을 보유하고 n
매번 증가합니다. 두 번째 열의 값이 부족해지면 이 배열을 사용하여 루프에서 해당 열을 채우고 i
카운터 역할을 하며 n
모듈로 연산자를 사용하여 해당 값을 배수로 0으로 다시 접습니다.
시험:
$ 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