• ベストアンサー

文字列抽出について

環境 ・Windows2000 SP4 ・Cygwin ※Windows環境ですがやりたいことがUNIX(bash)ベースなのでこちらに質問させていただきました。 あるディレクトリで ls -lAF | grep "^-" を実行し以下の出力(以下例)を得た後、awk等で「ファイル名」「サイズ」「日付」を抽出したいです。 (例) -rw-r--r-- 1 A0000001 なし 62 Mar 4 2005 aaa -rw-r--r-- 1 A0000001 なし 12099 Nov 7 2005 bbb -rw-r--r-- 1 A0000001 なし 62 Mar 9 2005 temp 1 ファイル名の取得は上記コマンド後、awkで$9を表示すれば、と思いましたが例の3番目の表示のようにファイル名がスペースで区切られていると表示が切れてしまい上手く取得できません。 $9以降の全てを抽出できるような方法をご教示いただけますか。awkでなくてもOKです。 よろしくお願いいたします。

  • aobei
  • お礼率73% (14/19)

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

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

#4です。 >上に書かれた方法はBEGINセクションに書くことをイメージされていますか? いいえ。BEGINって何故? ls -lAF | awk '/^-/{size=$5;hiduke=$6" "$7" "$8;OFS="";for(i=1;i<9;++i)$i="";filename=$0;OFS=",";print filename,size,hiduke}'

aobei
質問者

お礼

見当違いなこと言ってすいません。。 なるほどです。 紹介いただいた例のfor文のあたりを こねくりまわしていたところでした。 今回の件でawkについていろいろ 知ることが出来ました。 ありがとうございました!

その他の回答 (5)

回答No.5

 やや正攻法ではありませんが、 /bin/ls -lQ | awk '/^-/{ FS=" " ; $0 = $0 ;printf "%4s\t%s %2s %s ", $5, $6, $7, $8 ; FS="\"" ; $0 = $0 ; print $2 }' でそれらしい出力が得られました。

aobei
質問者

補足

ありがとうございます。 はい。 たしかにサイズ、日付、ファイル名確認しました。 申し遅れましたがこの後の加工の都合でファイル名を 先頭に。。というリクエストを受けていました。 ただ目的のものは取得できているので こちらの案、考えさせていただきます。

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

awkでの方法です。 案1: FIELDWIDTHを使って固定長区切りにする 参考:http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html 案2: 必要な情報を取得した後で、 OFS="";$1="";$2="";中略;$8="";filename=$0;OFS=" "

aobei
質問者

補足

ありがとうございます。 案2の方法で試しています。 上手くいきそうな気配がしていますが 私のコマンド記述が悪くてもう一歩の ところでつまっています。 上に書かれた方法はBEGINセクションに 書くことをイメージされていますか? 申し訳ありませんが補足いただけないでしょうか。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

Perlのsplit関数を使います split関数に分割の上限をしていすることで、最後の項目に残りの部分がはいります。 $field=split(/\s/,$_,9); $fileName=$field[8];

aobei
質問者

補足

ありがとうございます。 すいません、環境の制約でbashの コマンドしか使えないのです。 perlで書けたら。。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

> おっしゃる通りの問題でつまっております。 と言うことで… #include <stdio.h> int main(void) { char buf[BUFSIZ]; char date[3][BUFSIZ]; char size[BUFSIZ]; char name[BUFSIZ]; while (fgets(buf, BUFSIZ, stdin) != 0) { sscanf(buf,"%*s %*s %*s %*s %s %s %s %s %[^\n]", size, date[0], date[1], date[2], name); printf("name=\"%s\"\n",name); printf("size=%s\n",size); printf("date= %s %s %s\n\n", date[0], date[1], date[2]); } return(0); }

aobei
質問者

補足

ありがとうございます。 参考にさせていただきます。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

ls -lAF | grep "^-" | awk ' { print "size=" $5 print "date=" $6 " " $7 " " $8 printf "name=" for (i = 9; i <= NF ; ++i) { printf "%s ", $i } printf "\n" }' なら一応抽出はできますが空白が1個とは限らないし、TABの場合もあるのでだめですね。 やっはりここはCで書いたほうが早いかな。

aobei
質問者

補足

早速のご回答ありがとうございます。 おっしゃる通りの問題でつまっております。 こちらの都合によりbashで作成することに なっておりなんとも。。といったところです。

関連するQ&A

  • 文字列取得

    '/path1/path2/file1.txt' '/path1/path2/path3/file2.txt' 上記のようなpathがあった場合にファイル名(拡張子なし)の 文字列を取得したいのですがどのように良いでしょうか? 宜しくお願い致します。 awkで$4と指定すれば「file1.txt」の文字列を取得できるのですが パスの長さが定まっていないため$4ではなく最後の文字と指定する 記号はないでしょうか? echo /path1/path2/file1.txt |awk '{FS="/"; print $4}'

  • エクセルで文字列の中からいくつかの文字列を抽出したい

    次のようなリストがあります。 A1 トヨタボクシー A2 トヨタ ヴォクシー A3 ホンダ ステップワゴン A4 本田フィット A5 アコード A6 スズキアルト A7 ワゴンR A8 日産スカイライン A9 ニッサンプレセア このリストから、抽出条件のリスト トヨタ ホンダ 本田 スズキ 鈴木 ダイハツ ・・・ を使って、メーカー名を抽出したいのですが、どのような方法があるでしょうか? 抽出元のリストには、メーカー名が入っていたりいなかったり、漢字であったりカナであったりと統一性がありません。そのリストから、「日産~」「ニッサン~」と入力されているものは、「ニッサン」として抽出したいのです。 しかも、抽出した残りの、社名「ニッサンスカイライン」の「スカイライン」を、「日産プレセア」の「プレセア」の部分をついでに抽出したいのです。 ご存じの方、よろしくお願いいたします。

  • EXCELで一致する文字列を抽出する方法

    EXCELに関する質問です。 ファイル1に売上デ-タがあります。    A    B   C   D 1 商品名 品番 単価 個数 2  あ    A1  100   3 3  い    A2  110   10 4  う    A3   120   5 5  は    A4  130   3 6  ひ    A5  140   7 7  ふ    A6  150   11 8  へ    A7  160   6 9  ほ    A8  170   3 ファイル2に特定の商品名のリストがあります。   A    B   C 1 商品名 2  い 3  ろ 4  は 5  に 6  ほ 7  へ 8  と 9  ち 10  り 11  ぬ ファイル1のSHEET2に    A    B  C  D 1 商品名 品番 単価 個数 2  い    A2  110  10 3  は    A4  130   3 4  へ    A7  160   6 5  ほ    A8  170   3 の様に抽出する方法ですが、商品名が単純な文字列のときは フィルタ-の詳細設定で出来ますが、 商品名が  [8/1発売] 20%OFF  い A2 の様なキャッチコピ-付の文字列の場合、抽出することが出来ません。 (ファイル1・2共にキャッチコピ-付の商品名です。) この場合でも抽出できる方法をご教授いただけないでしょうか? 宜しくお願い致します。

  • スペースを含んだ文字列から文字列の抽出

    エクセルバージョン2007 スペースを含む文字列で、A列に文字列がある時、以下の式を組んで文字列を抽出しています。 先頭にIDの数字が有る場合は、それぞれの目的に合った文字列を抽出しています。 B1=LEFT(A1,SEARCH(" ",A1,1)-1) C1=LEFT(MID(A1,SEARCH(" ",A1,1)+1,LEN(A1)-SEARCH(" ",A1,1)),SEARCH(" ",MID(A1,SEARCH(" ",A1,1)+1,LEN(A1)-SEARCH(" ",A1,1)),1)-1) 3 3df-32654-10 CCCCHH 10 1ab-12345-00 AAABBBB この文字列の場合、B列に3と10が表示、C列に 3df-32654-10 1ab-12345-00が表示されます。 先頭に、IDの無い文字列は以下の様な構成です。 6rt-95132-00 PPPKKK この文字列の場合、B列に6rt-95132-00、C列にPPPKKKが表示されてしまい、この場合、IDの数字が無い場合はB列には表示させない又は、C列に6rt-95132-00させたいと思っています。 ご教授頂ければ幸いです。 以上、宜しくお願い致します。

  • PHP 文字列抽出

    はじめまして。PHPプログラミングの初心者で恐縮ですが、 ご質問させてください。 現在、携帯用HPを作成してPHPによりMYSQLからデータを 表示させるプログラミングを組んでいます。 そこで、DB(MYSQL)からデータを引っ張ってくる際に、 そのデータが長い場合には、 頭から10バイトを抽出して末尾に「…」を追加して 表示させるプログラミングを作成したいと考えております。 ところが、そのデータに半角文字が含まれ最後の10バイト目が 全角の場合、文字化けをしてしまいます。 ------------------------------------------- 例) 〔データ〕  あいaうえおか(23バイト)       ↓(substrにより10バイトを抽出して末尾に…を追加)  あいaうえ●… ●部分が文字化けする ------------------------------------------- 文字列の「お」の部分を1バイトで抽出している為、 文字化けしてしまっていると思いますが、 うまく「お」まで表示するか、もしくは「お」を 表示し

    • 締切済み
    • PHP
  • C言語 コンマで囲まれた文字列の抽出

    よろしくお願いします。C初心者です。 以下のようなテキストファイルがあります。 data1:1002,2.5,3.5,1.25 data2:1205,3.5,2.7,1.2 .......... たとえばdata1行の2.5と3.5と1.25を抽出したい場合、どうすればいいでしょうか? strstrを使ってアドレスを求めようとしましたが、最初のコンマ位置のアドレスは帰ってきますが、2番目、3番目のアドレスを取得するにはどうすればいいか? それぞれのアドレスが取得できればmemcpyで文字列抽出ができると思っているのですが。 その他でも、うまいやり方がありましたらご教授ください。

  • PHP 文字列抽出

    はじめまして。PHPプログラミングの初心者で恐縮ですが、 ご質問させてください。 現在、携帯用HPを作成してPHPによりMYSQLからデータを 表示させるプログラミングを組んでいます。 そこで、DB(MYSQL)からデータを引っ張ってくる際に、 そのデータが長い場合には、 頭から10バイトを抽出して末尾に「…」を追加して 表示させるプログラミングを作成したいと考えております。 ところが、そのデータに半角文字が含まれ最後の10バイト目が 全角の場合、文字化けをしてしまいます。 ------------------------------------------- 例) 〔データ〕  あいaうえおか(23バイト)       ↓(substrにより10バイトを抽出して末尾に…を追加)  あいaうえ●… ●部分が文字化けする ------------------------------------------- 文字列の「お」の部分を1バイトで抽出している為、 文字化けしてしまっていると思いますが、 うまく「お」まで表示するか、もしくは「お」を 表示しないようにプログラミングをしたいのですが、 どのように組めばよいかわかりません。 非常に初歩的なご質問で恐縮ですがご教授頂けると ありがたく思います。 どうぞよろしくお願い致します。

    • 締切済み
    • PHP
  • perlでの文字列抽出

    perlの文字列抽出と集計について教えてください。 ファイルAにある文字列をファイルBから探し、その単語の前後の5単語を集計したいと考えています。 fileA(ただの単語列です) たまねぎ かぼちゃ にんじん fileB(|で区切られています) ピラミッド|を|築く|労働者|に|は|たまねぎ|を|食べ|させた|と|いう|記録|も|あり たまねぎ|は|野菜|の|中|で|最|も|糖質|が|多く| ほくほく|した|西洋|かぼちゃ|は|、|料理|野菜|の|中|で|も にんじん|は|、|根|を|食べ|る|野菜|の|中|で|は|珍しく|緑黄色野菜|です 上記のようなファイルがあった場合に、「|」で区切られた前後5単語をとれるだけ取得すると以下のようになり たまねぎ を,築く,労働者,に,は,を,食べ,させた,と,いう,は,野菜,の,中,で かぼちゃ ほくほく,した,西洋,は,、,料理,野菜,の にんじん は,、,根,を,食べ,る 以下のように出現を集計して、一つのマトリックスにまとめたいと考えています。      を 築く 労働者 に は 食べ させた と いう 野菜... たまねぎ 2  1  1    1 2  1  1    1  1  1 かぼちゃ            1              1 にんじん 1           1  1 ... ... 初心者のためなかなかうまいやり方がみつけることができず ご教示いただけると助かります。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 異なるファイルのセル値を抽出する

    excel2010 異なるファイルのセル値を抽出する方法を教えてください。 下記に例を示します。 ファイル名:001.xlsm(ファイル名は、任意に変わります。どんなファイル名になるかは分かりません) シート名称:sheet1、sheet2…(複数あり不定です) 抽出したいセルには名前がついています。 sheet1のA4セルのセル名称が _nameAAA の様に。 ファイルによりセルの位置は変わるかもしれませんがセル名称は固定です。 001.xlsmのファイルに新規シート作成し、 あるセルに =_nameAAA とすると、sheet1のA4セルの値を表示してくれます。 抽出したいファイルが下記の様に複数あります。 001.xlsm,002.xlsm,003xlsm… 抽出したいセルの名前は固定で、下記の様にあります。 どのファイルにどのセル名称があるかは分かりません。 _nameAAA _nameAAB _nameAAC というセル名称があった時、 それぞれのファイルに新規シート作成して、セル名参照するのは手間なので、 以下の様にしたいです。 参照.xlsmというファイルを作成し、c:\workに登録します。 中身は sheet1の A1セルに=_nameAAA A2セルに=_nameAAB A3セルに=_nameAAC としておきます。 抽出したいファイルをc:\workにコピーし、参照.xlsmからマクロで セルの値を抽出して表示する様にしたいのです。 マクロ初心者なのでベタを教えていただきたく、よろしくお願いします。

  • perl ファイル内文字列抽出

    お世話になっております。 perlでファイルない文字データを抽出する作業をしたいですが、やり方が分からなくて、ご存知の方ぜひ教えて頂けばと思います。 001.html内の内容 <html> <head> </head> <body> テキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト<img src="aaa" \/>テキストテキストテキストテキストテキストテキストテキストテキスト<img src="bbb" \/><img src="ccc" \/><img src="aaa" \/>テキストテキストテキストテキストテキストテキストテキストテキスト</body> </html> 質問内容 (1)このなかの<img src="aaa" \/>イメージファイル名を抽出したいです。本文ではイメージファイルの拡張子はなしです。入力の間違いではないです。 (2)抽出した文字列をimg.txtファイルで出力 以上よろしくお願いします。

    • ベストアンサー
    • Perl