awkを使用してファイルの末尾の空白行を削除するには?

awkを使用してファイルの末尾の空白行を削除するには?

以下を使用して、ファイルの末尾にある空白行をすべて削除したいと思います。awk

次のコマンドを使用して、上部の空白行をすべて削除する方法を正常に見つけることができました。

awk '/^$/ && a!=1 {a=0} !/^$/ {a=1} a==1 {print}' file.txt

しかし、結論を取り除くために反転する方法がわかりません。上記のコマンドを使用してパイプで接続できることはわかっていますが、可能であればtacコマンドを使用する直接的なアプローチを好みます。awk

明確にすると、「視覚的に空の」行、つまり最大スペースおよび/またはタブを含む行は「空」と見なされます。

ベストアンサー1

アッ

awkは外部の助け(例えばTac)なしで最初の行から最後の行まで順番にファイルを読み取るので、実際にファイルの終わりに達したときに空の行ブロックがファイルの終わりにあるかどうかだけを知ることができます。

あなたができることは、空行(改行文字、基本レコード区切り文字などRS)を持つ変数を保持し、空でない行に達したら空白行を印刷することです。

awk '/^$/{n=n RS}; /./{printf "%s",n; n=""; print}' file

print nなぜとの間に違いがあるのか​​理解できませんprintf n

print出力レコード区切り記号の追加ORS、デフォルトは改行)を印刷する式に設定します。したがって、試してみると、追加の改行文字が得られます。次のように単一の出力ステートメントを使用して作成することもできます。

awk '/^$/{n=n RS}; /./{printf "%s%s%s",n,$0,RS; n=""}' file

エドまたは前任者

出力を印刷するには(Awkと同様)、次のいずれかのオプションを選択します。

printf '%s\n' 'a' '' '.' '?.?+1,$d' ',p' 'Q'  | ed -s file
printf '%s\n' 'a' '' '.' '?.?+1,$d' '%p' 'q!' | ex -s file

変更をファイルに直接適用するには、次のいずれかのオプションを選択します。

printf '%s\n' 'a' '' '.' '?.?+1,$d' 'w' 'q'   | ed -s file
printf '%s\n' 'a' '' '.' '?.?+1,$d' 'x'       | ex -s file

何が起こっているのか理解してください。

コマンドの置き換え

シェルはコマンド置換から末尾の改行を削除します。

printf '%s\n' "$(cat file)"

一部のシェルは大容量ファイルを処理できず、「引数リストが多すぎる」エラーが発生します。

からインスピレーションを受けるこの回答

おすすめ記事