3개의 서로 다른 변수에 대해 여러 행의 값을 입력하고 싶습니다.
$a
예를 들어 다음과 같은 , $b
및 가 있다고 가정해 보겠습니다 $c
.
ADD $a in $b to get $C
내 입력은 세 가지 변수 모두에 대해 행으로 표시됩니다.
변수를 처리하는 방법을 알고 있지만 더 많은 문제가 있습니다.
cat > a_list;for a in `cat a_list`; do echo "ADD \""$a"\";"; done
내 예제 출력은 다음과 같아야 합니다.
ADD apple in duck to get 11
ADD orange in cat to get 22
ADD pineapple in dog to get 33
ADD xx in bb to get 44
ADD abc in def to get 55
내 입력은 다음과 같습니다.
apple
orange
pineapple
xx
abc
duck
cat
dog
bb
def
11
22
33
44
55
이것이 가능한가? 아니면 출력을 얻는 다른 방법이 있습니까?
답변1
awk -v RS= -F '\n' '
{for (i = 1; i <= NF; i++) a[NR,i] = $i}
NF > max {max = NF}
NR == 3 {exit}
END{
for (i = 1; i <= max; i++)
printf "ADD %s in %s to get %s\n", a[1,i], a[2,i], a[3,i]
}' < input
와 함께 RS=
, 이것은단락 모드, 여기서 레코드는 단락입니다. perl
옵션과 유사한 기능을 가지고 있습니다 -00
(옵션과 혼동하지 마십시오 -0
). 줄 바꿈을 필드 구분 기호로 사용하므로 각 필드는 단락의 줄입니다. -F '\n'
각 필드에 원하는 내용을 생략할 수 있습니다 .단어이 단락.
셸 확장을 통해 문자열을 생성하려는 경우에도 더 유용한 순서로 문자열을 ADD $a in $b to get $c
배치하고 셸을 사용하여 후처리할 수 있습니다 .awk
< input awk -v RS= -F '\n' '
{for (i = 1; i <= NF; i++) a[NR,i] = $i}
NF > max {max = NF}
NR == 3 {exit}
END{
for (i = 1; i <= max; i++) for (j = 1; j <= NR; j++)
print a[j,i]
}' |
while
IFS= read -r a &&
IFS= read -r b &&
IFS= read -r c
do
printf '%s\n' "ADD $a in $b to get $c"
done
답변2
좋습니다. 이제 답을 찾을 수 있습니다.
# first create a file where the groups are delimited by one empty line
sed '/^$/ { N; s/^\n$//; }' < input_file > temp_file_1
# split the file into three files one for $a, one for $b and one for $c
sed -n '0,/^$/p' temp_file_1 | sed '$d' > a_values
sed -n '/^$/,/^$/p' temp_file_1 | sed '1d;$d' > b_values
sed '1,/^$/d' temp_file_1 | sed '1,/^$/d' > c_values
# paste the three files together and read them into the variables $a, $b, $c line by line
paste a_values b_values c_values | while read a b c; do
echo "ADD $a in $b to get $c"
done