200 行のファイルから 10 行目から 100 行目を新しいファイルに取得する方法

200 行のファイルから 10 行目から 100 行目を新しいファイルに取得する方法

200 行のファイルがあります。

10 行目から 100 行目までを抽出し、新しいファイルに入れる必要があります。

Unix/Linux でこれをどうやって行うのでしょうか?

使用できるコマンドは何ですか?

答え1

使用sed:

sed -n -e '10,100p' input.txt > output.txt

sed -n手段しないデフォルトでは各行を印刷します。-eは、次の引数を sed スクリプトとして実行することを意味します。10,100pは、10 行目から 100 行目 (含む) まで、pその行を印刷 ( ) することを意味する sed スクリプトです。その後、出力は に保存されますoutput.txt

ファイルが推奨よりも長い場合は、このバージョン (コメントで推奨) の方が高速になります。

sed -e '1,9d;100q'

つまり消去1-9行目、やめる100 行目以降を調べ、残りを印刷します。200 行の場合は問題になりませんが、200,000 行になると、最初のバージョンでは、印刷されない行もすべて調べます。一般的には明示的な最初のバージョンの方が好みですが、ファイルが長い場合は、この方法の方がはるかに高速です。データについて最もよく知っているのはあなたです。

あるいは、headと をtail組み合わせて使用​​することもできます。

tail -n +10 input.txt | head -n 91 > output.txt

今回は、tail -n +1010 行目からファイル全体を出力し、そのうちの最初の 91 行 (元のファイルの 100 行目まで) を出力します。同じ方法でhead -n 91リダイレクトされます。output.txt

答え2

これでいい

tail -n +10 file.txt | head -n 91 > newfile.txt

答え3

これを で行う場合vim、非常に簡単です。ファイル名が でsrc、行を移動したいファイルが であると仮定しますdestdestがまだ存在しない場合は、作成します。

touch dest

次に、srcdestの両方を開きますvim(-pフラグにより​​、引数がタブで開きます)。

vim -p src dest

10 行目にジャンプし、10 行目から 100 行目までのすべてを選択し、ヤンクし、その内容を含むタブに切り替えdest、貼り付けます。

10ggv101ygtp

注記: は101101 行目の先頭を選択します ( \n100 行目の末尾で をキャッチします)。


これは明らかにコマンドライン ツールを使用するよりも少し複雑なプロセスですが、視覚的に選択できるという利点があります (したがって、必要なものがすべて得られることが保証されます)。ただし、これは次の場合の適切な使用例でもあるようですawk

awk 'NR==10, NR==100' src > dest

変数NRを使用すると、行数に対するパターン マッチングが可能になります。したがって、上記のコマンドは、 から 10 ~ 100 行目を抽出しsrc、シェルは出力を にリダイレクトしますdest

答え4

いろいろな方法があります。

解決策awk:

$ awk 'NR<10{next};1;NR>100{exit}' file > new_file

解決策perl

$ perl -nle '
    print if $. > 9 and $. < 101;
    exit if $. > 100;
' file > new_file

関連情報