シェルコマンドを使用してファイルの最初のn行と最後の行を削除する方法は?

シェルコマンドを使用してファイルの最初のn行と最後の行を削除する方法は?

名前には次のファイルがあります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$を取得しようとすると、NEOFが発生し、処理が完全に停止します。しかし、パターンスペースにはすべての行が含まれており、14,20それらのどれもP印刷されず、印刷されたこともありませんでした。
  • 他のすべての行では、パターンスペースに最初に表示されるewlineのみをsed P印刷し、新しいループを開始する前に同じ内容(または次の6つの入力行)を削除します。行7は、新しいループでextコマンドを使用してスタックに再追加されます。\nDN

したがって、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行を削除するように簡単に変更できます+2tail;
または、最後の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

関連情報