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 +10
10 行目からファイル全体を出力し、そのうちの最初の 91 行 (元のファイルの 100 行目まで) を出力します。同じ方法でhead -n 91
リダイレクトされます。output.txt
答え2
これでいい
tail -n +10 file.txt | head -n 91 > newfile.txt
答え3
これを で行う場合vim
、非常に簡単です。ファイル名が でsrc
、行を移動したいファイルが であると仮定しますdest
。dest
がまだ存在しない場合は、作成します。
touch dest
次に、src
とdest
の両方を開きますvim
(-p
フラグにより、引数がタブで開きます)。
vim -p src dest
10 行目にジャンプし、10 行目から 100 行目までのすべてを選択し、ヤンクし、その内容を含むタブに切り替えdest
、貼り付けます。
10ggv101ygtp
注記: は101
101 行目の先頭を選択します ( \n
100 行目の末尾で をキャッチします)。
これは明らかにコマンドライン ツールを使用するよりも少し複雑なプロセスですが、視覚的に選択できるという利点があります (したがって、必要なものがすべて得られることが保証されます)。ただし、これは次の場合の適切な使用例でもあるようです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