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