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

こんにちは、
機種:Linux
下記のように、データのシェルによりデータの並び方を
ご教授をお願いします。
入力ファイル内容
G01 K01,K02,K03,K04
G02 K01,K03
G03 K02,K04

出力ファイル
K01 G01,G02
K02 G01,G03
K03 G01,G02
K04 G01,G03

for コマンドを使ってみましたが、できなかった。

csh, ksh, awkにより、作成方法はご存知の方が
いらっしゃいましたら、教えて頂けないでしょうか
以上

A 回答 (3件)

shellの機能だけでやってみました。


for x in K01 K02 K03 K04
do
 y=
 z=
 while read a b
 do
  case ",$b," in
  *,$x,*) y=$y$z$a
      z=, ;;
  esac
 done < input-file
 echo $x $y
done
    • good
    • 0
この回答へのお礼

notnot さん
本当に素晴らしいシェルです。随分に参考になりました。心から感謝します。回答して頂いてありがとうございます。

お礼日時:2004/11/21 14:44

こんにちは。



#1のshige_70さんのやり方が巧いと思いますが、
あえてforを使うとこんな感じになりますか...

各行で、K01~K04の何れかがあれば1カラム目を出力します。
データファイルの名前はtest.txtとして、出力は標準出力としました。

#!/usr/bin/ksh
for i in 1 2 3 4
do
awk 'BEGIN{printf("K0'$i' ")}/K0'$i'/{printf("%s ",$1)}END{printf("\n")}' test.txt
done
    • good
    • 0
この回答へのお礼

GokigenHoiHoi さん
素晴らしい考え方で、ご教授頂いて、
本当にありがとうございます。

お礼日時:2004/11/20 17:14

シェルの機能だけでは困難です。


awkの連想配列を用いれば簡単にできると思います。

awkの実装方法ですが、各行に対し、2カラム目をsplitした文字列をインデックスとした配列に1カラム目の文字列をつなげていって、最後にその配列を出力してあげれば良いでしょう。
    • good
    • 0
この回答へのお礼

なるほど、その考え方がありましか。やってみます。
教えていただいて、ありがとうござうます。

お礼日時:2004/11/20 13:56

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