いくつかのデータベースに相当するデータを含む ~23000 行の SQL ダンプがあります。このファイルの特定のセクション (つまり、1 つのデータベースのデータ) を抽出して、新しいファイルに配置する必要があります。必要なデータの開始行番号と終了行番号の両方を知っています。
ファイルから 16224 行と 16482 行の間のすべての行を抽出し、それらを新しいファイルにリダイレクトする Unix コマンド (または一連のコマンド) を知っている人はいますか?
いくつかのデータベースに相当するデータを含む ~23000 行の SQL ダンプがあります。このファイルの特定のセクション (つまり、1 つのデータベースのデータ) を抽出して、新しいファイルに配置する必要があります。必要なデータの開始行番号と終了行番号の両方を知っています。
ファイルから 16224 行と 16482 行の間のすべての行を抽出し、それらを新しいファイルにリダイレクトする Unix コマンド (または一連のコマンド) を知っている人はいますか?
sed -n '16224,16482p;16483q' filename > newfile
sedマニュアルから:
p - パターン スペースを (標準出力に) 出力します。このコマンドは通常、-n コマンド行オプションと組み合わせてのみ使用されます。
n - 自動印刷が無効になっていない場合は、パターン スペースを印刷し、その後、関係なく、パターン スペースを入力の次の行に置き換えます。それ以上入力がない場合、sed はそれ以上コマンドを処理せずに終了します。
q -
sed
それ以上コマンドや入力を処理せずに終了します。-n オプションで自動印刷が無効になっていない場合は、現在のパターン空間が印刷されることに注意してください。
sed スクリプト内のアドレスは、次のいずれかの形式にすることができます。
number 行番号を指定すると、入力内のその行のみに一致します。
2 つのアドレスをカンマ (,) で区切って指定することで、アドレス範囲を指定できます。アドレス範囲は、最初のアドレスが一致する場所から始まる行に一致し、2 番目のアドレスが一致するまで (包括的に) 続きます。
sed -n '16224,16482 p' orig-data-file > new-file
ここで、16224,16482は、開始行番号と終了行番号です。これは1インデックスです。 -n
入力を出力としてエコーすることを抑制します。これは明らかに望ましくありません。数字は、次のコマンドを操作するための行の範囲を示しています。このコマンドp
は、関連する行を出力します。
ヘッド/テールを使用すると非常に簡単です:
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
「vi」を使用してから、次のコマンドを使用できます。
:16224,16482w!/tmp/some-file
または:
cat file | head -n 16482 | tail -n 258
編集:- 説明を追加するために、head -n 16482を使用して最初の 16482 行を表示し、tail -n 258を使用して最初の出力から最後の 258 行を取得します。
perl -ne 'print if 16224..16482' file.txt > new_file.txt
# print section of file based on line numbers
sed -n '16224 ,16482p' # method 1
sed '16224,16482!d' # method 2
cat dump.txt | head -16224 | tail -258
トリックを行う必要があります。このアプローチの欠点は、テールの引数を決定し、「between」に終了行を含めるかどうかを考慮するために算術演算を実行する必要があることです。
sed -n '16224,16482p' < dump.sql
コマンドラインで確認するためにこれを行うこともできます:
cat filename|sed 'n1,n2!d' > abc.txt
例えば:
cat foo.pl|sed '100,200!d' > abc.txt
クイック&ダーティ:
head -16428 < file.in | tail -259 > file.out
おそらく最善の方法ではありませんが、うまくいくはずです。
ところで: 259 = 16482-16224+1.
ルビーの使用:
ruby -ne 'puts "#{$.}: #{$_}" if $. >= 32613500 && $. <= 32614500' < GND.rdf > GND.extract.rdf
ヘッド/テールトリックを投稿しようとしていましたが、実際にはおそらくemacsを起動するだけでした。;-)
新しい出力ファイルを開き、ctl-y save
何が起こっているのか見てみましょう。
私は使うだろう:
awk 'FNR >= 16224 && FNR <= 16482' my_file > extracted.txt
FNR には、ファイルから読み取られる行のレコード (行) 番号が含まれます。
これはうまくいくかもしれません(GNU sed):
sed -ne '16224,16482w newfile' -e '16482q' file
またはbashを利用する:
sed -n $'16224,16482w newfile\n16482q' file
受け入れる回答の -n は機能します。気が向いた場合の別の方法を次に示します。
cat $filename | sed "${linenum}p;d";
これにより、次のことが行われます。