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