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

awk初心者です。
あるファイル(targetファイル)に、どのような属性があるのかを検索ファイル(objectファイル)を
使って調べたいのです。そこでawkを使って:

targetファイル
5
a
c

objectファイル
1,aa
2,bb
3,cc
4,dd
5,aa
6,bb
7,cc
8,dd
9,aa
10,bb
a,cc
b,dd
c,aa
d,bb
e,cc
f,dd
g,aa
h,bb
i,cc
j,dd

以下のようなスクリプトを作成し
mawk32 -f スクリプト target.txt object.txt
としたのですが、動作しません。
何らかの御助言を頂ければ幸いです。

#targetファイル読み込み
FILENAME == ARGV[1]{
dat1[FNR]=$1
no_dat1 = FNR
}
#objectファイル読み込み
FILENAME == ARGV[2]{
dat2[FNR]=$0
no_dat2 = FNR
}
#相互に検索
END{
for (i = 1; i <= no_dat1; i++){
for (j = 1; j <= no_dat2; j++){
if (dat1[i]~/dat2[j]/) { print dat1[i],dat2[j] }
}}}

A 回答 (1件)

$ awk -f select.awk target.txt object.txt


5 2,aa
a 2,cc
c 2,aa

この↑結果がほしいのかな?

[select.awk]
BEGIN {
FS=","
}
#targetファイル読み込み
FILENAME == ARGV[1]{
tgt[FNR]=$1
no_tgt = FNR
}
#objectファイル読み込み
FILENAME == ARGV[2]{
obj1[FNR]=$1
obj2[FNR]=$2
no_obj = FNR
}
#相互に検索
END{
for (i = 1; i <= no_tgt; i++){
for (j = 1; j <= no_obj; j++){
if (tgt[i] == obj1[j]) { print tgt[i],obj1[2]","obj2[j] }
}}}

それとも、こっち↓?

$ awk -f select.awk target.txt object.txt
5 5,aa
a 1,aa
a 5,aa
a 9,aa
a a,cc
a c,aa
a g,aa
c 3,cc
c 7,cc
c a,cc
c c,aa
c e,cc
c i,cc

これなら、元のコードの
if (dat1[i]~/dat2[j]/) { print dat1[i],dat2[j] }

if (dat2[j] ~ dat1[i]) { print dat1[i],dat2[j] }
にかえればできるよ。
    • good
    • 0
この回答へのお礼

そうか、データ構造をきちんと把握した上で読み込み、==で対応させれば良いのですね。
ありがとうございました!大変勉強になりました。

お礼日時:2011/05/24 13:46

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