kshの使いかた

このQ&Aのポイント
  • kshを使用してあるディレクトリ配下の全ファイルを検索し、ヒットした文字列をcsvファイルに書きだす方法について教えてください。
  • 出力されたcsvファイルにはブランクや余計な改行が入り、文字列が正しく並んでいない問題が発生しています。
  • 解決策をご存知の方は、どのように改善するかアドバイスをいただけますでしょうか。
回答を見る
  • ベストアンサー

kshの使いかた

あるディレクトリ配下(L_DIR)の全ファイルを対象に検索をかけ、ヒットした文字列をcsvファイル(F_NAME.csv)に書きだす。 という処理を以下のawkを使い処理させたのですが、出力されたcsvファイルでは、ブランクや余計な改行が入ってしまい、1行目から順に文字列が並んでくれません。 どなたか手段をご存知の方、ご教示ください。 宜しくお願い致します。 ---sh抜粋---------------------------------------- ls $L_DIR |while read F dummy do F_NAME=$THISDATE"_"$F awk -f fetch.awk $L_DIR/$F > $R_DIR/$F_NAME.csv done ------------------------------------------------- ---fetch.awk------------------------------------- /<td/ { intCount = split($0, data, ">"); split(data[2], buff, "<"); printf("%s", buff[1]); printf("\n"); } -------------------------------------------------

  • Haana
  • お礼率100% (5/5)

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

ブランクや改行を削除したいなら、 gsub(/[ \n]/,"",buff[1]) ですが、改行は行ごとに処理している以上、入りようが無いですね。 入っているなら、おそらく、想定している形式のファイルと実際のファイル内容が食い違っているのでは? 例えば、 <td>aaaa bbbb</td> とか <td>aaaaa</td><td>bbbb</td> とかのファイルがあると、このスクリプトでは考慮外なので正しく処理できませんよね?

Haana
質問者

お礼

ご回答有難うございます。 確かにnotnotさんのおっしゃるとおりですね。 考慮不足でした。

関連するQ&A

  • 実行ファイルの識別方法?

    自分で何度か試したのですが、うまくいきません。ご存知の方ご教授ください。 ディレクトリを指定してその配下にあるファイル全てを実行ファイルか、シンポリックファイルか、普通?のファイルか判断しようとしましたがどうしても実行ファイルの判断処理でコンパイルエラーになります。 (lstatの使い方がちゃんとわかってない?) だいたい以下のような流れです。 ----------------- DIR *dirp; struct dirent *file; /*ここで指定ディレクトリのオープン処理(省略)*/ while((file = readdir(dirp)) != NULL) { char buff[65536]; struct stat buffer; sprintf(buff,"%s%s",dir_name,f->d_name); // 注)dir_nameは指定されたディレクトリ lstat(buff,&buffer); printf( "FILE[%s]\n",f->d_name); if( S_ISLNK( buffer.st_mode) ) { printf("SLINK!\n"); } else if( S_IXUSR(buffer.st_mode) ) { printf("IXUSR\n"); } else { printf("OTHER\n"); } } /*ディレクトリのクローズ処理(省略)*/ ----------------------------------- というような形です。 else if( S_IXUSR(buffer.st_mode) ) { printf("IXUSR\n"); } の文をぬけばコンパイルもとおり、実行もうまくいくのですが、これが入ってしまうとコンパイル自体「呼び出せるのは関数だけです」という??メッセージのエラーがでてしまいうまくとおりません。 どなたかアドバイスをお願いします。

  • Kshでエラー(no closing quote):原因わかりません

    下記のようなファイル管理シェルをLinuxで作っているのですが、 test.sh[42]: no closing quote というエラーがでて解決できません。 何が原因なのでしょうか。どなたかご教授ください。宜しくお願い致します。 #!/bin/ksh #KAKUNIN_DATEから更新されているファイルをリスト KAKUNIN_DATE="10 Jul" #これを随時更新 TODAY=`date +"%x"` TODAY_YMD=`date +"%j"` START_YMD=`date --date="${KAKUNIN_DATE}" +"%j"` let n=TODAY_YMD-START_YMD #対象ディレクトリ CHK_DIR=$1 if [[ -d $CHK_DIR ]];then continue else echo "Not Dir:$CHK_DIR" exit fi #検索文字列 CHK_STR=$2 if [[ $CHK_STR = "" ]];then echo "Pls set check-string" exit fi #ファイル形式 NAME_STR=$3 if [[ $NAME_STR = "" ]];then echo "Pls set file type(if all then \"*\")" exit fi ######## メイン echo "-------------------------------------------------" echo "調査日:$TODAY 検索文字列:$CHK_STR 調査:$CHK_DIR 形式:$NAME_STR - $KAKUNIN_DATE から今日まで($n日内)に更新されたファイル" echo "ヒット,サイズ,更新日,ファイル名" find $CHK_DIR -name "$NAME_STR" -type f -mtime -$n -print| while read StrLine do if [[ `cat $StrLine | grep $CHK_STR` = "" ]];then echo `ls -l $StrLine | awk '{print 0","$5","$6,$7,$8","$9}'` else echo `ls -l $StrLine | awk '{print 1","$5","$6,$7,$8","$9}'` fi done

  • ExcelVBAのDir関数について。

    下記の処理の流れで、「dir_check = Dir(f_name2)」の処理があります。ここで、Excelのファイル名を取得して変数として登録し、 きちんとファイル名が取得出来ていれば、結果抽出の処理を呼び出す 流れに持って行きたいのですが、値を代入できません。 ファイル名は、Excelの施設ファイル名シートのC列から取得して、 同じものを「f_name2」で取得したパスから探し出す仕組みです。 ファイルの有無は、文字数をカウントして結果が0以上ならファイルありの処理です。上手く流す処理の仕方を教えてください。 ご教示頂けますようお願い致します。 For nendo = 1 To 2 path = Worksheets("スタート").Cells(11, 4) path = path & Worksheets("スタート").Cells(8 + nendo - 1, 4) & "\" For shisetsu = 1 To 188 f_name1 = Worksheets("施設ファイル名").Cells(shisetsu + 1, 3) f_name2 = path & Worksheets("施設ファイル名").Cells(shisetsu + 1, 1) & "\" & f_name1 dir_check = Dir(f_name2) If Len(dir_check) > 0 Then dir_err(shisetsu, nendo) = 1 Workbooks.Open Filename:=f_name2 Call 結果抽出 Workbooks(f_name1).Close End If Next shisetsu Next nendo

  • 漢字を配列に入れたいのですが

    漢字を配列に入れたいのですが、うまくいきません。 3列、60行のcsvファイルを読み込んで配列に入れようをしているのですが、1列目、2列目、3列目にある漢字をそれぞれ配列に入れようとしているのですが、出力するとうまくいかないんです。誰か教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; unsigned int data1[60], data2[60], data3[60]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; ll= fgets(buff,MAXBUFFSIZE,fp); while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); data1[j] = words[0]; data2[j] = words[1]; data3[j] = words[2]; j++; } printf("%s\n%s\n%s\n", data1,data2,data3); }

  • gawk複数ファイルを同ファイル名でフォーマットする方法

    gawk複数ファイルを同ファイル名でフォーマットする方法 gawkを使いcsv形式のファイルをjson形式のファイルにフォーマットしようと考えています。 簡単に説明しますと、 ●csvファイル test1.csv test2.csv test3.csv ↓↓↓↓ ●jsonファイル xxx-test1.json xxx-test2.json xxx-test3.json という風にフォーマットさせたいのです。 現在、 jsonファイル出力後の記述を ●aaa.awk BEGIN { FS = ","; printf("{"); } { printf("%s,%s,%s,%s", $1,$3,$4,$5); printf("],"); } END { printf("}"); } このようにし ●コマンドライン gawk -f aaa.awk test1.csv > xxx-test1.json これで一ファイルずつのフォーマットはできたのですが、 ファイル数が複数あり面倒なため、一気にフォーマットしたいのです。 その方法をご教授お願い致します。

  • ZIPを解凍するとフォルダ名が文字化けする

    いつもお世話になっております。 現在、linux上(CentOS 5.7)でディレクトリ名に日本語文字列を含むディレクトリ配下に、ファイル名に 日本語文字列を含まないファイルが複数あります。 これを、ディレクトリごとzipに圧縮してWinSCPでローカルのwindowsマシン(XP)に送って、 解凍をするとファイル名が文字化けしてしまいました。 *例* date_dir L1_A繝・・繧ソ_dir | L1_1_date.csv | L1_2_date.csv | L2_B繝・・繧ソ_dir    L2_1_data.csv **** *圧縮したもの* date_dirごとその下のディレクトリとファイルをZIPにする コマンド:zip data_dir/*/* date_dir L1_Aデータ_dir | L1_1_date.csv | L1_2_date.csv | L2_Bデータ_dir    L2_1_data.csv ************* ファイル名の文字コードを変換するには、「convmv」というのを使用すればよいみたいなのですが、 フォルダ名の文字コードの変換が出来ずに、困っております。 フォルダ名の文字化けを直す(正常に1_Aデータ_dirというフォルダが作成されるようにする)為には、 どのような方法があるのか、ご存知の方がいらっしゃいましたら、御教え頂けますでしょうか。

  • ファイルアップローダ+複数のディレクトリを削除するシステムについて

    以下のようなフォルダ構成で、複数のディレクトリを削除するシステムを構築しよと しましたが、1ディレクトリのみしか削除できませんでした。 20090601 - xxx1.txt yyy1.txt zzz1.txt のフォルダ20090601と、ファイルxxx1.txt,yyy1.txt,zzz1.txt のみしか削除できませんでした。理想は、すべてのディレクトリ、ファイルを削除しようと、試行錯誤 しましたが、なかなかうまくいきません。 わかる人がいたら、ご教授のほどよろしくお願いします。 ============フォルダ構成==================================== 20090601 - xxx1.txt yyy1.txt zzz1.txt 20090602 - xxx2.txt yyy2.txt zzz2.txt 20090603 - xxx3.txt yyy3.txt zzz3.txt 20090604 - xxx4.txt yyy4.txt zzz4.txt $_WK_dir_name[1] = "20090601" $_WK_dir_name[2] = "20090602" $_WK_dir_name[3] = "20090603" $_WK_dir_name[4] = "20090604" ============プログラム====================================== // ファイルアップロード処理 (省略) // ディレクトリ数のカウント処理 (省略) // ディレクトリとディレクトリの中身を削除 for ($i = 1; $i < 4; $i++) { // 削除するディレクトリパスを設定 $_dir_path = './' . $_WK_dir_name[$i] . '/'; printf("★1"); // ディレクトリ・ハンドルをオープン $res_file = opendir( $_dir_path ); printf("★2"); // ディレクトリ内のファイル名を1つずつを取得 while( $file_name = readdir( $res_file ) ){ // ファイルかどうか判定する if (is_file($_dir_path . $file_name)) { unlink($_dir_path . $file_name); } } printf("★3"); closedir( $res_file ); printf("★4"); rewinddir( $res_file ); printf("★5"); // ディレクトリの中身が空になったところで、ディレクトリを削除する。 rmdir($_WK_dir_name[$i]); printf("★6"); } ============================================================

    • ベストアンサー
    • PHP
  • シェルスクリプトでのファイル操作

    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の"find"コマンド同等のプログラム作成について

    お世話になっております。 現在UNIXの"-type f"オプションのついた"find"コマンドと同等のプログラムをC言語で作ろうとしています。 つまりディレクトリ内のファイル(サブディレクトリ内のファイル含む、ディレクトリは除外)を全てフルパスで表示するプログラムです。 現在下記の関数を作成したのですがうまく動いてくれません。 どなたかご教授いただけないでしょうか。 【問題】 プログラム内の(**)前後で"dir1"が変更される。 (**)前:"/ディレクトリA/" (**)後:"/ディレクトリA/ディレクトリA内のファイル1" 本当は"dir1"には:"/ディレクトリA/"のままであってほしいです。 "strcat"コマンドの仕様が影響しているのでしょうか。 int _find(char dir1[] , int k ,int l , int m ) { DIR *dir ; struct dirent *dp ; struct stat statbuf ; char txt[1000] ; if ( m == 0 ) l++ ; if ( (dir = opendir(dir1)) == NULL ){ printf("%s",dir1) ; perror("opendir") ; exit(1) ; } for( dp=readdir(dir) ; dp != NULL ; dp=readdir(dir) ){ if ( strcmp(dp->d_name,".") != 0 && strcmp(dp->d_name,"..") != 0 ){ /* ROOT_DIR名-にファイル名を付け加えて、フルパスにする */ strcpy( temp[k][l] , dir1) ; strcat( temp[k][l] , "/" ) ; strcat( temp[k][l] , dp->d_name ) ;  (**) stat( temp[k][l] , &statbuf ) ; if(S_ISDIR(statbuf.st_mode)){ l=_find(temp[k][l],k,l,1) ; }else{ sort[k][l]=temp[k][l] ; printf("temp[%d][%d]=%s\n",k,l,sort[k][l]); printf( "dir5=%s\n",dir1) ; l++ ; } } } closedir(dir) ; return l ; }

  • awkでのファイル読み込み

    シェルを作成しています。 昔kshを作ってたので、ksh+awkでCSVファイル処理をしたいのですが、記憶が古く、覚えていないし、調べてもわかりませんでした。 参考になるサンプルソースや、参考になるHP等助言頂けたうれしいです。 ファイル読み込みがうまくいってないのか、getlineを使うべきなのか..。 #!/bin/ksh -x #Parameter Check if [ $# -ne 1 ];then echo "Error File Name Must Specified" exit 1 fi # Check File Exist ls $1 >/dev/null 2>&1 if [ $? -ne 0 ];then echo "Error File Not Found" exit 1 fi # Read File awk -F"," '{  フィールドセパレター変更→CSVファイルを一行ずつ読み込み→各処理をしたいです。 }' $1 宜しくお願いいたします。