複数変数の複数行入力

複数変数の複数行入力

3つの異なる変数に複数の行の値を入力したいと思います。

$aたとえば、次のような、$bおよびがあるとします$c

ADD $a in $b to get $C

私の入力は、3つの変数すべてに対して行として表示されます。

変数の処理方法を知っていますが、より多くの問題があります。

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

関連情報