多个变量的多行输入

多个变量的多行输入

我想为 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'您希望每个字段都是的单词这些段落。

如果您希望通过 shell 扩展生成字符串ADD $a in $b to get $c,那么您仍然可以将awk它们放在更有用的顺序中,并使用 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

答案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

相关内容