|
最近Unixを始めたのですが、サブルーチンの作り方がわかりません。 (呼び方、書き方) 簡単な例を教えていただけると幸いです。 |
|
awk scriptを使って下の様なことがしたいのですが、方法を教えて下さい。 Input File1: 10 abcde 9 bcdef 12 cdefg Input File2; 3 abcde 5 cdefg 12 defgh ファイル1と2を比較し、$2の内容が同じ場合、file1 と file2 の $1 $2 を output file の $1 $2 $3 $4に出力する。 比較して見つからない 場合はスペースを出力する。 Output file 10 abcde 3 abcde 12 cdefg 5 cdefg 3 abcde 12 defgh よろしくお願いします。 |
|
> サブルーチンの作り方がわかりません。 言語がわからないと何とも言えません。 > awk scriptを使って下の様なことがしたいのですが #!/usr/bin/awk -f BEGIN{ while (getline< ARGV[2] >0 ){ hash[$2]=$1 } while (getline< ARGV[1] >0 ){ if ( hash[$2] ){ print $1,$2,hash[$2],$2 } else { printf "%s %s \n",$1,$2 } delete hash[$2] } close(ARGV[2]); while (getline< ARGV[2] >0 ){ if ( hash[$2] ){ print $1,$2 } } } FreeBSD の awk と Solaris の nawk では動きましたが、 Solaris の awk では動かず。 うーん、awk らしくない…(笑) まぁ awk スクリプトを 書いたのは4年ぶりくらいなので、これで勘弁して下さい。 # 見本求む。 |
|
すみません。 Perlです。 |
|
> # 見本求む。 見本かどうか分かりませんが、私は次のように書きました。 #!/usr/bin/awk -f { array[$2] = sprintf("%s %s", array[$2], $1); } END { for( key in array ){ split(array[key], tmp); if( 2 in tmp ) printf("%s %s %s %s\n", key, tmp[1], key, tmp[2]); else printf("%s %s\n", key, tmp[1]); } } 起動は % awk -f script file1 file2 としてください。連想配列に記録して、最後に出力という感じです。 ただし、次のような $2 が同じだが $1 が違う値を含む形式のデータは 仮定していません。 10 abcde 11 abcde どちらかを捨てるようになっているかと思います。実際にはデータの形式の チェックが要るかと思います。あと出力の順が不定になります。出力の 順番に依存する処理には向きません。動作チェックはしていません。 多分、本家の awk じゃ無理かな。動作チェックは gawk でやっています。 |
|
># 見本求む。 単なるバリエーションということで… #!/usr/bin/awk -f NR == 1 { f = FILENAME } f == FILENAME { hash[$2]=$1 } f != FILENAME { if ( $2 in hash ) { print hash[$2], $2, $1, $2 delete hash[$2] } else print $1, $2 } END { for (r in hash) print hash[r], r } |