我想为 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