- ベストアンサー
テキストのn行目から後ろm行目をとるには?
要は各種レポートのヘッダとフッターをカットしたいのですが、 テキストの「先頭n行目から後ろm行目まで」をとるにはどうしたらよいでしょうか? たとえば、 テキストの「先頭3行目から後ろ5行目まで」をとるにはどうしたらよいでしょうか? head -n 3 hogehoge.txt > 3.txt これで先頭3行目をとれますが、このあとです。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
> テキストの「先頭3行目から後ろ5行目まで」をとるにはどうしたらよいでしょうか? 私なら、こうするかな。 % echo '3,$-5p' | ed -s hogehoge.txt
その他の回答 (8)
- xjd
- ベストアンサー率63% (1021/1612)
>% echo '3,$-5p' | ed -s hogehoge.txt なるほど! echoは知ってたけど、edは思いつきませんでした。 良いアイデアですね。
お礼
いろいろとありがとうございました。
- astronaut
- ベストアンサー率58% (303/516)
すでに ed を使ったエレガントな解が示されていますが,もう一度自分の回答を添削しておきます. head -$(( `wc -l < sample.txt` - 8 )) sample.txt | tail +7 くどくてすみません.
お礼
いえいえ、ありがとうございます。 ついでに、他の方にも参考になるように解説させていただきます。 お題:ヘッダ 6行とフッダ8行を取り除く 回答:head -$(( `wc -l < sample.txt` - 8 )) sample.txt | tail +7 wc -l sample.txt | sed s/sample.txt// wcの結果でファイル名"sample.txt"が出力されてしまうのでそれを切り捨てしているのですね。 さらにこの部分は wc -l < sample.txt とすることで、よりスマートになると。 (ありがとうございます!ほかで wc -l $source | cut -b 3-8 とやって切り捨ていたので使わせていただきます!) それで、 $(( `wc -l < sample.txt` - 8 )) の部分が sample.txtの行数-8 と計算されて(sh系でないと動かないみたいですね) head -n sample.txt のようになり、sample.txtの上からn行(ヘッダ+ボディ)が出力されると。 最後に head -n sample.txt | tail +7 で、7行目より下を出力する(ボディを取り除く)と。 計算ができると知らなかったので、とても勉強になりました。 どうもありがとうございました!
- astronaut
- ベストアンサー率58% (303/516)
すみません.引用符が変でした(あれでも動きますが…) head -$(( `wc -l sample.txt | sed s/sample.txt//` - 8 )) sample.txt | tail +7
お礼
どうもありがとうございます。 勉強に活用させていただきます。
- astronaut
- ベストアンサー率58% (303/516)
tac というのは初めて知りました.便利ですね. これだけシンプルな解が示されているのに,あえて tac を使わないなら, 一応以下でできます.(泥くさいですが) あ,bash 固有の機能を使ってます.tcsh とかなら無視して下さい. ヘッダ 6行とフッダ8行を取り除く. head -$(( `wc -l sample.txt | sed 's/sample.txt'//` - 8 )) sample.txt |tail +7 でも,この際 tac を含めて,gnu textutils をインストールしたらいかがでしょうか?
お礼
ご回答ありがとうございます。 こういった回答は応用的な勉強ができるので 大変参考になります! どうもありがとうございます! #残念ながら、あえて使わないのではなく、残念ながらインストールできないのですよ。。。 #お客さんの業務マシンなもので。
- xjd
- ベストアンサー率63% (1021/1612)
>手元にはtacというコマンドがないのですが、これはどういうコマンドなのでしょうか?また、このコマンドをしようぜずに実現したいのですが、可能でしょうか? tacコマンド入ってないでしょうか? Linuxにはたいていあるのですが、他のUNIX系OSを使われているのでしょうか?
補足
何度も大変ありがとうございます。 残念ながら入っていませんし、入れることもできません。 OSはIBM AIXです。
- xjd
- ベストアンサー率63% (1021/1612)
質問がわかりにくいのですが テキストファイルの先頭3行と後ろ2行を取り出す場合は、 head -3 ファイル名 ; tail -2 ファイル名 でできると思います。こういう質問ですか?
補足
ご回答ありがとうございます。 大変失礼したしました。補足させていただきます。 レポートが「ヘッダ+ボディー+フッタ」で構成されているとします。 ヘッダとフッタを捨て、ボディーのみが欲しいのです。 よろしくお願いします。
- xjd
- ベストアンサー率63% (1021/1612)
お詫び。 あとで質問をよく読み直したんですけど、 >ヘッダとフッターをカットしたいのですが、 ヘッダとフッターを切り捨てたいのではなく、 ヘッダとフッターを取り出してくっつけたいという質問ですね? #1はその逆(中を取り出す方法)なのでまちがってました。
お礼
ご回答ありがとうございます。 すみません。「カットしたい」というのは「捨てたい」と言うことです。 日本語って難しいですね。(^^; 各種レポートのヘッダとフッターを捨てたいのです。 テキストの先頭n行目から後ろm行目までを取得したいのです。 「head -n 3 hogehoge.txt > 3.txt これで先頭3行目をとれますが、このあとです。」 これは完全ボケていました。すみません。。。 手元にはtacというコマンドがないのですが、これはどういうコマンドなのでしょうか?また、このコマンドをしようぜずに実現したいのですが、可能でしょうか? よろしくお願いします。
補足
大変申し訳ございません。 aix,FreeBSDのman,「UNIXの部屋」でtacを調べて載っていなかったので質問させていただいたのですが、教えていただいていましたね。大変申し訳ございません。早とちりしてしまいました。 また、再度「man tail」を実行したところ、オプションの説明ではなく、読み流していた本文に「+」についての記述を確認できました。大変すみませんでした。 目的のことは、教えていただいた tail +3 ファイル名 でヘッダの切り捨てできました。 あとは、フッタを切り捨てたいのですが・・・。 よろしくお願いします。
- xjd
- ベストアンサー率63% (1021/1612)
たとえばテキストファイルの先頭2行と、後ろ3行を取り除くときは tail +3 ファイル名 | tac | tail +4 | tac こんな感じで処理してますが、こういう事がしたいのですか? ちなみにtacはcatコマンドを反転して出力するコマンドです。
お礼
ご回答ありがとうございます。 大変すばらしいですね! ここまでシンプルな回答があるとは思いませんでした! 感動しました。 今回は、これを採用させていただきます! ありがとうございました。