• ベストアンサー

テキストのn行目から後ろm行目をとるには?

要は各種レポートのヘッダとフッターをカットしたいのですが、 テキストの「先頭n行目から後ろm行目まで」をとるにはどうしたらよいでしょうか? たとえば、 テキストの「先頭3行目から後ろ5行目まで」をとるにはどうしたらよいでしょうか? head -n 3 hogehoge.txt > 3.txt これで先頭3行目をとれますが、このあとです。

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.6

> テキストの「先頭3行目から後ろ5行目まで」をとるにはどうしたらよいでしょうか? 私なら、こうするかな。 % echo '3,$-5p' | ed -s hogehoge.txt

noname#27709
質問者

お礼

ご回答ありがとうございます。 大変すばらしいですね! ここまでシンプルな回答があるとは思いませんでした! 感動しました。 今回は、これを採用させていただきます! ありがとうございました。

その他の回答 (8)

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.9

>% echo '3,$-5p' | ed -s hogehoge.txt なるほど! echoは知ってたけど、edは思いつきませんでした。 良いアイデアですね。

noname#27709
質問者

お礼

いろいろとありがとうございました。

  • astronaut
  • ベストアンサー率58% (303/516)
回答No.8

すでに ed を使ったエレガントな解が示されていますが,もう一度自分の回答を添削しておきます. head -$(( `wc -l < sample.txt` - 8 )) sample.txt | tail +7 くどくてすみません.

noname#27709
質問者

お礼

いえいえ、ありがとうございます。 ついでに、他の方にも参考になるように解説させていただきます。 お題:ヘッダ 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)
回答No.7

すみません.引用符が変でした(あれでも動きますが…) head -$(( `wc -l sample.txt | sed s/sample.txt//` - 8 )) sample.txt | tail +7

noname#27709
質問者

お礼

どうもありがとうございます。 勉強に活用させていただきます。

  • astronaut
  • ベストアンサー率58% (303/516)
回答No.5

tac というのは初めて知りました.便利ですね. これだけシンプルな解が示されているのに,あえて tac を使わないなら, 一応以下でできます.(泥くさいですが) あ,bash 固有の機能を使ってます.tcsh とかなら無視して下さい. ヘッダ 6行とフッダ8行を取り除く. head -$(( `wc -l sample.txt | sed 's/sample.txt'//` - 8 )) sample.txt |tail +7 でも,この際 tac を含めて,gnu textutils をインストールしたらいかがでしょうか?

noname#27709
質問者

お礼

ご回答ありがとうございます。 こういった回答は応用的な勉強ができるので 大変参考になります! どうもありがとうございます! #残念ながら、あえて使わないのではなく、残念ながらインストールできないのですよ。。。 #お客さんの業務マシンなもので。

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.4

>手元にはtacというコマンドがないのですが、これはどういうコマンドなのでしょうか?また、このコマンドをしようぜずに実現したいのですが、可能でしょうか? tacコマンド入ってないでしょうか? Linuxにはたいていあるのですが、他のUNIX系OSを使われているのでしょうか?

noname#27709
質問者

補足

何度も大変ありがとうございます。 残念ながら入っていませんし、入れることもできません。 OSはIBM AIXです。

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.3

質問がわかりにくいのですが テキストファイルの先頭3行と後ろ2行を取り出す場合は、 head -3 ファイル名 ; tail -2 ファイル名 でできると思います。こういう質問ですか?

noname#27709
質問者

補足

ご回答ありがとうございます。 大変失礼したしました。補足させていただきます。 レポートが「ヘッダ+ボディー+フッタ」で構成されているとします。 ヘッダとフッタを捨て、ボディーのみが欲しいのです。 よろしくお願いします。

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.2

お詫び。 あとで質問をよく読み直したんですけど、 >ヘッダとフッターをカットしたいのですが、 ヘッダとフッターを切り捨てたいのではなく、 ヘッダとフッターを取り出してくっつけたいという質問ですね? #1はその逆(中を取り出す方法)なのでまちがってました。

noname#27709
質問者

お礼

ご回答ありがとうございます。 すみません。「カットしたい」というのは「捨てたい」と言うことです。 日本語って難しいですね。(^^; 各種レポートのヘッダとフッターを捨てたいのです。 テキストの先頭n行目から後ろm行目までを取得したいのです。 「head -n 3 hogehoge.txt > 3.txt これで先頭3行目をとれますが、このあとです。」 これは完全ボケていました。すみません。。。 手元にはtacというコマンドがないのですが、これはどういうコマンドなのでしょうか?また、このコマンドをしようぜずに実現したいのですが、可能でしょうか? よろしくお願いします。

noname#27709
質問者

補足

大変申し訳ございません。 aix,FreeBSDのman,「UNIXの部屋」でtacを調べて載っていなかったので質問させていただいたのですが、教えていただいていましたね。大変申し訳ございません。早とちりしてしまいました。 また、再度「man tail」を実行したところ、オプションの説明ではなく、読み流していた本文に「+」についての記述を確認できました。大変すみませんでした。 目的のことは、教えていただいた tail +3 ファイル名 でヘッダの切り捨てできました。 あとは、フッタを切り捨てたいのですが・・・。 よろしくお願いします。

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.1

たとえばテキストファイルの先頭2行と、後ろ3行を取り除くときは tail +3 ファイル名 | tac | tail +4 | tac こんな感じで処理してますが、こういう事がしたいのですか? ちなみにtacはcatコマンドを反転して出力するコマンドです。

関連するQ&A