• 締切済み

UNIX シェルスクリプト 文字列操作について

あるシェルスクリプトを作成しなければいけないのですが、あまりシェルに詳しくないのでご教授いただけると助かります。 Linux上で以下のようなIDごとに定義してあるテキストファイルがあり ます。 ※2000IDほど記載してあります。 cat sample.txt --------------- ID=00001 parm=xxxxx flag=0 path=xxxxx --------------- ID=00002 parm=yyyyy flag=1 path=yyyyy --------------- ID=00003 以下略--- 上記の定義ファイルをID単位でエクセルの表に纏めたいので、以下のような横並びのCSVファイルに出力させるシェルスクリプトを作りたいのですが、どうかご教授いただけると助かります。 スクリプト実行後イメージ cat result.csv 00001,xxxxx,0,xxxxx 00002,yyyyy,1,yyyyy 00003 -----略-----

みんなの回答

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

順序良く並んでいるなら sed でもいいかも sed '/^ID/{N;N;N;s/[^\n]*=//g;s/\n/,/gp;};d' sample.txt

seemogujp
質問者

お礼

sedでも、簡単に出来るんですね!ありがとうございます!確認してみます!

回答No.1

動作確認していませんが以下の様な感じでできると思います。 cat sample.txt | awk \ 'BEGIN { FS="=" } { if (substr($0,1,1)=="-") { next } A[$1]=$2 if ($1=="path") { printf("%s,%s,%s,%s\n",A["ID"],A["parm"],A["flag"],A["path"]) } } END {}' > result.csv

seemogujp
質問者

お礼

ありがとうございます!期待通りの動作になりました!助かりました!また多少仕様変わるかもしれないので、その際はご質問させていただくかもしれません。ありがとうございました!

関連するQ&A

  • UNIXのシェルスクリプト

    UNIXのシェルスクリプトで以下のようなことをやりたいのですがいい方法を教えて下さい。 ファイルの中にある文字列があります。 たとえば”CURREND_DIR” この文字列をシェルスクリプトでカレントのディレクトリパスに変換したいのですが いい方法が思いつきません。 set dir_data = ‘pwd‘ sed -e ’s/CURRENT_DIR/$dir_data’ ファイル名 でできるかなと思ったのですが、”CURRENT_DIR”が”$dir_data”に置換されてしまいます。 さらにdirパスが”/”で区切られていることも問題のようです。

  • シェル・スクリプトへの変数の定義方法を教えて下さい。

    シェル・スクリプトへの変数の定義方法を教えて下さい。 下記コマンドを実行するには、変数にどの様に指定すれば良いでしょうか。 宜しくお願い致します。 手入力での正しいパラメーターの渡し方。 ./test.sh parm1 parm2 "parm3 a b [\"X\" \"Y\"];" シェル・スクリプトでのパラメーターの渡し方は? #!/bin/bash Cmd=" ????????????? どの様に指定すれば良いでしょうか? ?????????????" buf=$(Cmd)

  • UNIX のシェル 文字の置換について

    シェルでファイルの文字列を置換したいです。 /*~*/のコメントの文字なので、1行数を変えたくないです。 ─────────────────────────── ※1文字分の空白を「_」で表示します。 test.txtファイルの「XXXXX」を「aa___」に置換する。 ─────────────────────────── 【test.txt 置換前】 /**************/ /*_XXXXXYYYYY_*/ /**************/ 【シェルの内容 test.sh】 #!/bin/csh set IN_henkan = `printf "%-5s" $1` perl -i -p -e 's/XXX/'$IN_henkan'/g' test.txt 【シェルを実行】 test.sh aa 【test.txt置換前 希望する状態】 /**************/ /*_aa___YYYYY_*/ /**************/ 【test.txt置換前 実際の状態】 /**************/ /*_aa_YYYYY_*/ /**************/ ─────────────────────────── 「aa」の後ろに1文字分の空白しか挿入されないです。

  • シェルの実行ファイル位置の取得

    sh実行時に絶対パスで指定するのですが、その実行したshのディレクトリは取得できないのでしょうか。 実行した後にそのパスを利用してシェル位置まで移動したいです。 /home/user/xxxxx/yyyyy/zzzzz/aaa.sh ↑をどこの場所で実行しても実行後には /home/user/xxxxx/yyyyy/zzzzz/の位置に移動をしていたいのですが、 シェル内で/home/user/xxxxx/yyyyy/zzzzz/を取得する事は可能でしょうか。

  • シェルスクリプトで文字コード変換

    Linuxをつかいシェルスクリプトを組んでいます AAA.csvというファイルをBBB.csvにリネームしたいと思っています。 ただリネームするだけであれば以下で出来ると思うのですが、 mv .AAA.csv BBB.csv 文字コードを変換したいのでiconvをしたいとおもっています。 (環境的にnkf等は使えませんでした) 以下のようにすれば目的は達成できるのですが あまりキレイな書き方ではないのでもう少しなんとかならないかと考えています。 iconv -f utf8 -t sjis AAA.csv > BBB.csv rm -f AAA.csv 複数のコマンドを組み合わせてキレイにできるのであれば、どなたかご助言お願い致します。

  • シェルスクリプトでのファイル操作

    Linuxをつかいシェルスクリプトを組んでいます for arg in ${DIR}_/*.csv do md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> ${DIR}/HASH.csv done 上記のような処理でHASH.csvにファイル名とファイルのハッシュ情報を登録しています。 ↓登録されたデータはこんな形になります。  aa/bb/cc/xx.csv,aa339d9idedeeded・・・  aa/bb/cc/ww.csv,aa339d9idedeeded・・・   しかし、このままだとこのパスの部分『aa/bb/cc/』が邪魔なので削除したいと考え 以下のようにしましたが、うまく登録できません。 sed -e "s/\/\(aa\)\/\(bb\)\/\(cc\)\///g" ${DIR}/HASH.csv > ${DIR}/B8HASH.csv >>で出力するようにしたら削除前の下に削除後の情報が追加されてしまいました。 このような場合はどのようにしたら良いのか、ご助言お願い致します。 この方法ではなく、for文の時点で削除できるようであればその方法を教えてください。

  • UNIX シェルスクリプト

    UNIXのシェルスクリプトを使用してテキストファイルのある列にある 特定の文字列を条件としてその行を出力するということをやりたいのですが どのようにすればできるでしょうか? 例えば,以下のようなテキストファイルがあって,2列目がYAHOOの行を 主力したいというようなことです。 AAA SOFTBANK BBB YAHOO YAHOO TEST CCC QUICK DDD YAHOO ↓ BBB YAHOO DDD YAHOO

  • シェルスクリプトで条件を指定してファイルの加工を行いたいのですが

    シェルスクリプトで条件を指定してファイルの加工を行いたいのですが シェルスクリプト(ksh)で、入力ファイルから条件に該当する行だけ抽出して出力したいと考えています。 ただ1つ条件があって、【awkは使用禁止】です。 処理としては ID00001,山田太郎,社員 ID00002,田中花子,社員 ID00003,中島次郎,派遣 というCSVファイルがあって、3列目の値が社員のものを抽出して ID00001,山田太郎,社員 ID00002,田中花子,社員 というファイルを出力したいのです。 下記のようなシェルになるとは思いますが手詰まりです。awkなら一瞬で終わるのですが、シェルだけですと3列目の抽出方法がよくわかりません。シェルに詳しい方、ご教示願えます。 while read line do if (3行目を抽出する条件); then print ${line} >> output.csv fi done < input.csv

  • UNIXのシェルスクリプト

    以下のようなことをUNIXのシェルスクリプトでやりたいのですが いい方法が思いつきません。 どなたか教えて下さい。 元ファイル   :   : .model RNWX r .model RPX r .model RNX r .model RPOX r 条件ファイル RNWX 1000 0.7 RPX 900 0.4 RNX 800 0.072 元ファイルと条件ファイルを読み込んで以下のようなファイルを出力したい。 出力ファイル   :   : .model RNWX r  tc1=1000 tc2=0.7 .model RPX r   tc1=900  tc2=0.4 .model RNX r   tc1=800  tc2=0.072 .model RPOX r (条件ファイルに記述のないものについては元ファイルのまま)

  • AutoCADのスクリプト

    お世話になります。 AutoCAD LT97上で1,000近くのdwgファイルをdxfへ変換しなければならなくなりました。色々調べたところAutoCADのスクリプトファイル(.scr)を使えば何とかなりそうなので、見よう見まねで作って見たものの、途中で処理が止まってしまいます。ご指導のほどよろしくお願いします。 ;---- header cmddia 0 filedia 0 ;---- main script open "d:\xxxxx\yyyyy\100038.dwg" saveas dxf v lt97 16 "d:\xxxxx\yyyyy\100038.dxf" close open "d:\xxxxx\yyyyy\100039.dwg" saveas dxf v lt97 16 "d:\xxxxx\yyyyy\100039.dxf" close open "d:\xxxxx\yyyyy\100040.dwg" saveas dxf v lt97 16 "d:\xxxxx\yyyyy\100040.dxf" close ;---- footer new . filedia 1 cmddia 1 こんな感じです。

専門家に質問してみよう