611

いくつかのデータベースに相当するデータを含む ~23000 行の SQL ダンプがあります。このファイルの特定のセクション (つまり、1 つのデータベースのデータ) を抽出して、新しいファイルに配置する必要があります。必要なデータの開始行番号と終了行番号の両方を知っています。

ファイルから 16224 行と 16482 行の間のすべての行を抽出し、それらを新しいファイルにリダイレクトする Unix コマンド (または一連のコマンド) を知っている人はいますか?

4

25 に答える 25

889
sed -n '16224,16482p;16483q' filename > newfile

sedマニュアルから:

p - パターン スペースを (標準出力に) 出力します。このコマンドは通常、-n コマンド行オプションと組み合わせてのみ使用されます。

n - 自動印刷が無効になっていない場合は、パターン スペースを印刷し、その後、関係なく、パターン スペースを入力の次の行に置き換えます。それ以上入力がない場合、sed はそれ以上コマンドを処理せずに終了します。

q -sedそれ以上コマンドや入力を処理せずに終了します。-n オプションで自動印刷が無効になっていない場合は、現在のパターン空間が印刷されることに注意してください。

sed スクリプト内のアドレスは、次のいずれかの形式にすることができます。

number 行番号を指定すると、入力内のその行のみに一致します。

2 つのアドレスをカンマ (,) で区切って指定することで、アドレス範囲を指定できます。アドレス範囲は、最初のアドレスが一致する場所から始まる行に一致し、2 番目のアドレスが一致するまで (包括的に) 続きます。

于 2008-09-17T13:42:34.123 に答える
216
sed -n '16224,16482 p' orig-data-file > new-file

ここで、16224,16482は、開始行番号と終了行番号です。これは1インデックスです。 -n入力を出力としてエコーすることを抑制します。これは明らかに望ましくありません。数字は、次のコマンドを操作するための行の範囲を示しています。このコマンドpは、関連する行を出力します。

于 2008-09-17T13:46:37.327 に答える
113

ヘッド/テールを使用すると非常に簡単です:

head -16482 in.sql | tail -258 > out.sql

sedの使用:

sed -n '16224,16482p' in.sql > out.sql

awkの使用:

awk 'NR>=16224&&NR<=16482' in.sql > out.sql
于 2008-09-17T13:46:05.440 に答える
40

「vi」を使用してから、次のコマンドを使用できます。

:16224,16482w!/tmp/some-file

または:

cat file | head -n 16482 | tail -n 258

編集:- 説明を追加するために、head -n 16482を使用して最初の 16482 行を表示し、tail -n 258を使用して最初の出力から最後の 258 行を取得します。

于 2008-09-17T13:42:18.133 に答える
19
perl -ne 'print if 16224..16482' file.txt > new_file.txt
于 2008-09-17T13:43:22.560 に答える
10
 # print section of file based on line numbers
 sed -n '16224 ,16482p'               # method 1
 sed '16224,16482!d'                 # method 2
于 2008-09-17T13:42:38.257 に答える
6
cat dump.txt | head -16224 | tail -258

トリックを行う必要があります。このアプローチの欠点は、テールの引数を決定し、「between」に終了行を含めるかどうかを考慮するために算術演算を実行する必要があることです。

于 2008-09-17T13:49:29.207 に答える
5

sed -n '16224,16482p' < dump.sql

于 2008-09-17T13:45:18.657 に答える
3

コマンドラインで確認するためにこれを行うこともできます:

cat filename|sed 'n1,n2!d' > abc.txt

例えば:

cat foo.pl|sed '100,200!d' > abc.txt
于 2014-02-05T06:41:52.253 に答える
3

クイック&ダーティ:

head -16428 < file.in | tail -259 > file.out

おそらく最善の方法ではありませんが、うまくいくはずです。

ところで: 259 = 16482-16224+1.

于 2008-09-17T13:44:24.413 に答える
3

ルビーの使用:

ruby -ne 'puts "#{$.}: #{$_}" if $. >= 32613500 && $. <= 32614500' < GND.rdf > GND.extract.rdf
于 2015-05-21T12:23:02.610 に答える
2

ヘッド/テールトリックを投稿しようとしていましたが、実際にはおそらくemacsを起動するだけでした。;-)

  1. esc--goto - xline ret16224
  2. マーク(ctrl- space
  3. esc--goto - xline ret16482
  4. esc-w

新しい出力ファイルを開き、ctl-y save

何が起こっているのか見てみましょう。

于 2008-09-17T13:49:50.453 に答える
2

私は使うだろう:

awk 'FNR >= 16224 && FNR <= 16482' my_file > extracted.txt

FNR には、ファイルから読み取られる行のレコード (行) 番号が含まれます。

于 2013-01-01T18:51:30.037 に答える
1

これはうまくいくかもしれません(GNU sed):

sed -ne '16224,16482w newfile' -e '16482q' file

またはbashを利用する:

sed -n $'16224,16482w newfile\n16482q' file
于 2015-08-10T13:00:01.857 に答える
0

受け入れる回答の -n は機能します。気が向いた場合の別の方法を次に示します。

cat $filename | sed "${linenum}p;d";

これにより、次のことが行われます。

  1. ファイルの内容をパイプします (または必要に応じてテキストをフィードします)。
  2. sed は指定された行を選択し、それを出力します
  3. 行を削除するには d が必要です。そうしないと、sed はすべての行が最終的に印刷されると想定します。つまり、d がないと、${linenum}p の部分で印刷を要求しているため、選択した行によって印刷されるすべての行が 2 回印刷されます。-n は基本的に d ここで同じことをしていると確信しています。
于 2015-12-10T14:27:43.357 に答える