Várias linhas de entrada para múltiplas variáveis

2

Eu gostaria de inserir várias linhas de valores para três variáveis diferentes.

Por exemplo, digamos que eu tenha $a , $b e $c em uma linha como:

ADD $a in $b to get $C

Minha entrada será em linhas para todas as três variáveis:

Eu sei como fazer apenas por uma variável, mas estou preso por mais do que isso:

cat > a_list;for a in 'cat a_list'; do  echo "ADD \""$a"\";"; done

O resultado do meu exemplo deve ser o seguinte:

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

Minha entrada seria como abaixo:

apple
orange
pineapple
xx
abc


duck    
cat    
dog   
bb    
def


11    
22    
33    
44    
55

Isso é factível? ou existem outras maneiras de alcançar o resultado?

    
por remy 18.03.2016 / 08:32

2 respostas

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

Com RS= , esse é o modo de parágrafo , onde os registros são parágrafos. perl tem um recurso semelhante com a opção -00 (não confundir com -0 ). Usamos newline como um separador de campo, então cada campo é uma linha desse parágrafo. Você pode deixar de fora o -F '\n' se você preferir que os campos sejam cada palavra desses parágrafos.

Se você quiser que as strings sejam geradas por um shell que esteja expandindo ADD $a in $b to get $c , então você ainda pode ter awk colocando-as em uma ordem mais útil e pós-processá-las com o shell:

< 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
    
por 18.03.2016 / 10:34
0

Ok, agora podemos encontrar uma resposta:

# 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
    
por 18.03.2016 / 10:50