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

두 번째 열의 값이 부족해지면 해당 열에는 더 이상 값이 없을 것이라고 가정하면,

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

관련 정보