名前には次のファイルがありますElement_query
。
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
シェルコマンドを使用して最初の行と最後の行を削除したいと思います。
答え1
GNUの使用sed
:
sed -i '1d;$d' Element_query
仕組み:
-i
ファイル自体を編集するオプション。必要に応じてオプションを削除し、出力を新しいファイルまたは別のコマンドにリダイレクトすることもできます。1d
最初の行を削除する(1
最初の行にのみ影響するためd
削除)$d
最後の行を削除する($
最後の行にのみ適用、d
削除)
さらに一歩進んでください。
- 範囲を削除することもできます。たとえば、
1,5d
最初の5行を削除します。 SQL>
usingステートメントで始まるすべての行を削除することもできます。/^SQL> /d
- すべての空白行を削除できます。
/^$/d
- 最後に、
statement1;statement2;satement3;...
セミコロン()で区切ったり、コマンドラインで個別に指定()してすべての-e 'statement1' -e 'statement 2' ...
ステートメントを結合したりできます。
答え2
頭;
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
上記のように、最初のコマンドの出力ヘッダーから削除する最初の行数とhead
書き込む行数を指定できます。outfile
第二に。また、一般的sed
に次よりも高速です。特に、入力が次のような場合にはさらにそうです。大きい- 2回の通話が必要です。どこsed
確実にしなければならない<infile
しかし、この場合には好ましい。いいえ正規、検索可能ファイル - 通常のようにいいえこの場合、期待どおりに機能しますが、sed
すべての出力修正は単一のスクリプトプロセスで処理できます。
GNUの場合、否定的な形式をhead
使用できます-
[num]
2番目のコマンドでも同様です。この場合、次のコマンドは入力から最初の行と最後の行を削除します。
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
またはPOSIXを使用してくださいsed
。
たとえば、20行の入力を読み取っていますが、最初の3行と最後の7行を削除したいと思います。私がこれを行うことにした場合は、sed
テールバッファを使用して実行します。まず、3個と7個を加えて合計10個を作成し、次の手順を実行します。
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
以下は、入力から最初の3行と最後の7行を削除する例です。アイデアは、必要なだけ多くの行をバッファリングして、スタックのパターン空間から入力の尾を削除し、引き出す各行に対して最初の行だけをP
印刷することです。
- Onlinesは、各行
1,10
sed
P
ごとにパターンスペースの入力を1行ずつ牧草地ループに積み重ねるため、何も印刷しませんb
。 - 3行目では、すべての
sed
スタックがd
削除されます。したがって、最初の3行は出力から一度に削除されます。 sed
入力の最後の行に達してext$
を取得しようとすると、N
EOFが発生し、処理が完全に停止します。しかし、パターンスペースにはすべての行が含まれており、14,20
それらのどれもP
印刷されず、印刷されたこともありませんでした。- 他のすべての行では、パターンスペースに最初に表示されるewlineのみを
sed
P
印刷し、新しいループを開始する前に同じ内容(または次の6つの入力行)を削除します。行7は、新しいループでextコマンドを使用してスタックに再追加されます。\n
D
N
したがって、seq
出力は(これは連続番号が付けられた20行です)、sed
ちょうど印刷してください:
4
5
6
7
8
9
10
11
12
13
入力の尾から削除したい行数が多いと問題になることがあります。sed
`の性能はパターン空間の大きさに正比例するからです。それにもかかわらず、これは多くの場合実行可能なソリューションであり、POSIXはsed
競合が発生する前に少なくとも4kbを処理できるパターンスペースを指定します。
答え3
次の回避策を試してください。
tail -n +2 name_of_file | head -n-1
カスタマイズ
最初のn行を削除するように簡単に変更できます+2
。tail
;
または、最後のn行-1
の変更を削除します。head
。
答え4
範囲の間で行を選択できますawk
(行数を知っていると仮定)。
awk 'NR>1 && NR < 3' file
またはPerlでは:
perl -ne 'print if $.>1 && $.<3' file
行数がわからない場合は、次のコマンドを使用して即座に計算できます。grep
(この方法では空行を計算せず、grep -c '' file
空白行も計算できます。)
awk -vm="$(grep -c . file2.txt)" 'NR>1 && NR<m' file2.txt