AIと戦って、あなたの人生のリスク診断 >>

お世話になります。
ディレクトリにファイル群があるとします。
そのファイル群の中の特定のファイルの特定の個所を抽出し、別ファイルに吐くというシェルを組みたいのですが、
どのようにしたら良いでしょうか?

<例>
●ファイル群は作成された日付を持ちます。
売上_200601.txt、売上_200602.txt、売上_2006003.txt、売上_200604.txt・・・・・・

●ファイルの中身はある法則が成立しています。
(売上_20060101.txtの中身)
東京都 start
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
1000円
東京都 end
大阪府 start
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
10000円
大阪府 end
神奈川県 start
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
20000円
神奈川県 end
北海道 start
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
3000円
北海道 end



※都道府県の重複はありません

月毎の売上が纏められているファイルの中から特定の年月の都道府県売上分を抽出したいです。
抽出条件としましては「年月」「都道府県」が与えられます。
上記の例でいくと、「売上_200601.txt」の「東京都 start~東京都 end」までを抽出したいのです。
ファイルの特定は抽出条件の「年月」を元にfindコマンドにて導き出すことは可能なのですが、
中身の「東京都 start~東京都 end」をどのように抽出するのかが分かりません。

分かり難い内容に恐縮ですが、ご教授の程よろしくお願いします。

A 回答 (3件)

#1>AWKを使う例


----------------------------------------------------------------
/^東京都 start$/,/^東京都 end$/{ print }
----------------------------------------------------------------
でイイと思います。
例えば、日本語をちゃんと認識するようになっていれば
上記をselect.awk という名前で保存してあるとすると
awk -f select.awk 売上_200601.txt
でうまくいくと思います。(gawk ではテストしました)
    • good
    • 0

↓のような感じ。



awk '/^東京都 start/,/^東京都 end/{print}' ファイル

ただし、マルチバイト文字対応awkでないと正常に動作しないかもしれません。
    • good
    • 0

Perl か AWK を使うのがいいんじゃないかと思います

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
AWKを使うケールの例を挙げて頂けることは可能でしょうか?
お願いします。

お礼日時:2006/08/21 14:17

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Q~以外を削除する場合(rmコマンド)

linuxのコマンドで
~以外のファイル、ディレクトリを全て削除したい時は
どのような記述をすれば良いのでしょうか?
シェルスクリプトではなくrmコマンド1つで削除したのいですが…

例: tar以外のファイル・ディレクトリを
   すべて削除したい場合など

どなたかご存知の方がいらっしゃったら
教えてください。よろしくお願い致します。

Aベストアンサー

rm コマンドのみという訳にはいきませんが基本的なコマンドを組み合わせると実現可能と思います。

「名前が tar で終わるもの以外のファイル・ディレクトリを削除する」場合だと

ls | grep -v -E 'tar$' | xargs rm -r

となります。

ファイルの一覧を取得し ( ls )
'tar'で終わるもの以外を抽出し ( grep )
その結果を rm -r の引数に指定して実行 ( xargs )

という流れです。

ファイルを削除するような操作については失敗するとダメージが大きいので、事前にテストして動作を確認すると良いとおもいます。また rm -r -i としてそれぞれのファイルについて、削除の問い合わせをするのも有効です。

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Qawkやsed等で特定の文字間を抜き出す

cat text
aaaa
bbbb
<AAA>
ccc
ddd
<BBB>
eee
とあるときに
<AAA>
ccc
ddd
<BBB>
だけ抜き出したいです。
どのようにすればよいでしょうか?

Aベストアンサー

sed なら
sed -ne '/<AAA>/,/<BBB>/p'
awk なら
awk '/<AAA>/,/<BBB>/{print}'
ついでに perl なら
perl -ne 'print if /<AAA>/ .. /<BBB>/'

Qsedなどで、特定の文字列の後の文字列を抽出したい

sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

Aベストアンサー

日本語対応sedだと日本語数字混じりでもできますね。

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング