プロが教えるわが家の防犯対策術!

今、awkを使ったシェルスクリプトを作っています。

aaa bbb ccc ddd
ee ff gggg hhh

といったファイルから、
bbb,ccc
ff,gggg
を取り出したいと思っています。

そこで、以下のコマンドをwhileでまわして、$iを増加させることにより、
ファイルを一行ずつ読み取り、目的の列を取り出したく思っています。

A=`cat sample.txt|awk 'NR == $i {print NR, $2;}'`
B=`cat sample.txt|awk 'NR == $i {print NR, $3;}'`

ところが、awkコマンドの中の$iがシングルクォーテーションでくくられているので、
変数展開されなくて困っています。

何かよい方法があればご教授いただけますでしょうか?

A 回答 (2件)

シングルが使えないならダブルでくくるとか


A=`cat sample.txt|awk "NR == $i {print NR, \\$2;}"`
-vオプションでawkの変数に代入するとか
A=`cat sample.txt|awk -v i=$i 'NR == i {print NR, $2;}'`


ですけど、そもそも、1行ずつ取り出すのに catで全部出力→awkで全部入力→1行だけ出力 って効率悪すぎませんか?

同じwhileを使うにしても
cat sample.txt | while read line
do
A=`echo ${line} |awk '{print $2;}'`
B=`echo ${line} |awk '{print $3;}'`
...
と1行ずつ処理するとか、bashだったら
cat sample.txt | while read line
do
declare -a a=($line)
A=${a[0]}
B=${a[1]}
と配列を使うとか
行番号が欲しかったら cat -n sample.txtにして $1に行番号を入れるか、i=`expr $i + 1` で行番号を数えるとか

あるいは
awk '{ NRと$2と$3を使った処理 }' sample.txt
とawkだけで済ましてしまう、とか
    • good
    • 0
この回答へのお礼

教えていただいた、下記の方法で作成しました。ずいぶんと見やすくなったと思います。

cat sample.txt | while read line
do
A=`echo ${line} |awk '{print $2;}'`
B=`echo ${line} |awk '{print $3;}'`

素人の質問に、ご丁寧に回答を下さってありがとうございました。
精進します。今後ともよろしくお願いします。

お礼日時:2010/09/02 15:02

「シングルクォートでくくると展開されないので困る」なら, 「シングルクォートでくくらない」というのが最もシンプルな対処法ではないか

な.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!