여러 변수에 대한 여러 줄 입력

여러 변수에 대한 여러 줄 입력

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

관련 정보