200行のファイルがあります。
10から100までの行を抽出し、それらを新しいファイルに入れる必要があります。
UNIX/Linuxでこれをどのように行いますか?
使用できるコマンドは何ですか?
sed を使用:
sed -n -e '10,100p' input.txt > output.txt
sed -n
は、デフォルトで各行を印刷するしないことを意味します。 -e
は、次の引数をsedスクリプトとして実行することを意味します。 10,100p
はsedスクリプトで、10行目から開始して100行目まで(包括的)、その行を印刷(p
)することを意味します。次に、出力はoutput.txt
に保存されます。
ファイルが推奨よりも長い場合、このバージョン(コメントで推奨)はより高速になります。
sed -e '1,9d;100q'
つまり、delete1行目から9行目、quit、100行目、および残りを印刷します。 200行の場合は問題になりませんが、200,000行の場合、最初のバージョンでは、印刷する予定がなくてもすべての行が確認されます。明確にするために一般的に最初のバージョンを好みますが、長いファイルを使用すると、これははるかに速くなります—データを最もよく知っています。
または、head
とtail
を組み合わせて使用することもできます。
tail -n +10 input.txt | head -n 91 > output.txt
今回は、tail -n +10
は10行目からファイル全体を出力し、head -n 91
はその最初の91行を出力します(元のファイルの100行目まで)。同じ方法でoutput.txt
にリダイレクトされます。
vim
でこれを行うとしたら、それは非常に簡単です。ファイルの名前がsrc
で、行の移動先のファイルがdest
であるとします。 dest
がまだ存在しない場合は、作成します。
touch dest
次に、src
とdest
の両方をvim
で開きます(-p
フラグは引数をタブで開きます):
vim -p src dest
10行目にジャンプします。 10行目から100行目までをすべて選択します。ヤンク; dest
を含むタブに切り替えます。ペースト。
10ggv101ygtp
注:101
は、101行目の先頭を選択します(100行目の末尾で\n
をキャッチします)。
これは、コマンドラインツールを使用するよりも明らかに複雑なプロセスですが、視覚的に選択できるという利点があります(したがって、必要なものすべてを確実に取得できます)。ただし、これもawk
の適切な使用例のようです。
awk 'NR==10, NR==100' src > dest
NR
変数を使用すると、行数に対してパターンマッチングを実行できます。したがって、上記のコマンドは、src
から行10〜100を抽出し、シェルは出力をdest
にリダイレクトします。
これはすべきです
tail -n +10 file.txt | head -n 91 > newfile.txt
あなたはそれを多くの方法で行うことができます。
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