web-dev-qa-db-ja.com

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

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

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

UNIX/Linuxでこれをどのように行いますか?

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

22
sunil

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行の場合、最初のバージョンでは、印刷する予定がなくてもすべての行が確認されます。明確にするために一般的に最初のバージョンを好みますが、長いファイルを使用すると、これははるかに速くなります—データを最もよく知っています。

または、headtailを組み合わせて使用​​することもできます。

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

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

41
Michael Homer

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

touch dest

次に、srcdestの両方を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にリダイレクトします。

7
HalosGhost

これはすべきです

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

6
Creek

あなたはそれを多くの方法で行うことができます。

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
3
cuonglm