Element_query
クエリの結果を含む名前のファイルがあります:
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
シェルコマンドを使用して1行目と最後の行を削除したい。
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>
のステートメントを使用して始まる行をすべて削除することもできます。/^SQL> /d
/^$/d
statement1;statement2;satement3;...
)で区切るか、コマンドライン(-e 'statement1' -e 'statement 2' ...
)で個別に指定することで、任意のステートメントを組み合わせることができます。1,3d
最初の3行が削除されます)が、最後には少し難しくなります。必要に応じて、この:sed -i '/^SQL> /d' Element_query
を使用SQL>
して、ファイルのどこにあるかに関係なく始まる行を削除することをお勧めします。
sed -i '1d' table-backup.sql
は、SQLテキストファイルの最初の行を削除していました
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
上記を使用すると、最初のhead
コマンドで出力の先頭から取り除く最初の行数outfile
と、2番目のコマンドで書き込む行数を指定できます。また、通常は、2回の呼び出しを必要とするにもかかわらず、sed
特に入力が大きい場合よりも高速にこれを行います。ただし、通常のlseekableファイルではない場合はsed
間違いなく優先されるべきです。これは通常、そのような場合に意図したとおりには機能しませんが、単一のスクリプトプロセスですべての出力変更を処理できるためです。<infile
sed
GNU head
を使用すると、2番目のコマンドでも-
負の形式を使用できます[num]
。その場合、次のコマンドは入力から最初と最後の行を取り除きます。
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
sed
:たとえば、20行の入力を読んでいて、最初の3行と最後の7行を削除したいと考えた場合、w / sed
で解決するとしたら、テールバッファを使用します。最初に3と7を足し合わせて合計10のストリップカウントにしてから、次のようにします。
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
これは、入力から最初の3行と最後の7行を削除する例です。アイデアは、スタック上のパターンスペースの入力の末尾から削除したい数の行をバッファーに入れることができるが、P
引き込まれたすべての行に対してこれらの最初の行のみをリントすることです。
1,10
sed
P
上では何もリントしません。これは、それらのそれぞれに対して、ランチループでラインごとにパターンスペースに入力を積み重ねているためですb
。sed
のスタックd
が削除されます。したがって、最初の3行は1回で出力から削除されます。sed
到達した$
プルへの入力と試みの最後の行N
EXTをそれがEOFを打つと完全に処理を停止します。しかし、その時点では、パターンスペースにはすべての行が含まれ14,20
ていますP
。いずれもまだリントされていません。sed
P
おきに\n
、パターンスペースで最初に発生するewline までしかリントせず、残りの行D
または次の6行の入力で新しいサイクルを開始する前にそれを削除します。7番目の行はN
、新しいサイクルでextコマンドを使用してスタックに再び追加されます。そのため、seq
の出力(連続した20行の行)のうち、次のものsed
のみが出力されます。
4
5
6
7
8
9
10
11
12
13
これは、入力の末尾から削除する行の数が多い場合に問題になります- sed
のパフォーマンスはパターンスペースのサイズに直接比例するためです。それでも、多くの場合、これは実行可能なソリューションです。POSIXは、sed
バスティングする前に少なくとも4kbを処理するパターンスペースを指定します。
tail
、拡張サポートtail -n+<num>
「ラインからのスタートという意味の構文<num>
」
ファイルから先頭行と末尾行を削除するには、いくつかの方法があります。
awk
パターンマッチングと行カウントの両方を処理するために使用できますが、
#you need to know length to skip last line, assume we have 100 lines
awk 'NR>1 && NR<100 {print $0};' < inputfile
#or
awk '/SQL/ {next}; {print $0;};' < inputfile |awk 'NR>1&& NR<10 {print $0};'
使用grep -v
したくない行をパターンで除外したり、-E
オプションを使用して複数のパターンを一致させたり、
grep -v -E "SQL>" < inputfile > outputfile
head
およびtail
を使用して、特定の行数をトリムできます。
lines=$((`wc -l < inputfile`-2)) #how many lines in file, less 2
head -n-1 < inputfile | head -n$lines > outputfile
#or
tail -n+2 < inputfile | head -n$lines > outputfile
を使用してvi/vim
、最初と最後の行を削除できますが、
vi inputfile
:1
dd
:$
dd
:w! outputfile
:x
perlスクリプトを使用して、最初の行をスキップし、各行を保存し、次の行が表示されたら印刷して、
#left as exercise for the reader :-)
head
s については、実際にはパイプは必要ありません。実際、パイプを使用できなければ、パイプをまったく使用しない方が良いでしょう。あなたが行うとhead | head
- 2つのプロセスが同時に実行できる一方で、彼らはまた、両方の実質的にすべての重複同じデータを処理しています。代わりに{ head >dump; head >save; } <in
オフセットでスキップするだけです-最初は10行を>dump
読み取り、2番目は次の 10行を読み取ります>save
。
あなたは、はるかに良いによって提供されると思い切り取る SQLコマンドを。これは2つの方法で実行できます。
シーケンス " "が出力内のどこにも発生しないことが確実な場合、SQL>
grep -v -F 'SQL> ' < infile > outfile
よくわからない場合は、
grep -v '^SQL> .*;$' < infile > outfile
2番目のバージョンはより遅くなりますが、より正確です。 "SQL>"で始まりセミコロンで終わる行を無視します。
ただし、その余分な出力を最初からファイルに入れない方が良いでしょう。ほとんどのSQLシステムには、その方法がいくつかあります。私はOracleにあまり詳しくありませんが、この答えが役立つかもしれません。
を使用してawk
:
< inputfile awk 'NR>1 {print r}; {r=$0}' > outputfile
< inputfile
:のコンテンツリダイレクトinputfile
へawk
のをstdin
> outputfile
:のコンテンツリダイレクトawk
さんstdout
へのoutputfile
NR>1
:処理中のレコードの数が1より大きい場合にのみ、次のアクションを実行します{print r}
:変数の内容を出力します r
{r=$0}
:処理中のレコードのコンテンツを変数に割り当てます r
したがって、awk
スクリプトの最初の実行では、アクションの最初のブロックは実行されませんが、アクションの2番目のブロックが実行され、レコードのコンテンツが変数に割り当てられますr
。2回目の実行では、アクションの最初のブロックが実行され、変数の内容r
が出力されます(したがって、前のレコードが出力されます)。これには、処理された各行を印刷する効果がありますが、最初の行と最後の行が印刷されます。
r
ます。