web-dev-qa-db-ja.com

空白行をスキップするawk

私のスクリプトの出力は、awkを次のように使用してタブ区切りです:

awk -v variable=$bashvariable  '{print variable"\t single\t" $0"\t double"}' myinfile.c

awkコマンドは、ループごとに変数値とファイルmyinfile.cを更新するwhileループで実行されます。このコマンドで期待どおりの結果が得られます。ただし、inmyfile.cに空白行(含まれている場合があります)が含まれている場合、関連情報は出力されません。 awkに空白行を無視するように指示できますか?

awkに渡す前にmyinfile.cから空白行を削除することでそれができることを知っています。私はsedtrの方法を知っていますが、awkが上記のコマンド自体でそれを実行し、以下のような個別の解決策やパイプによる解決策ではないことを望みます。

sed '/^$/d' myinfile.c
tr -s "\n" < myinfile.c

提案と返信をよろしくお願いします。

27
Gil

行をフィルターで除外するには、2つの方法があります。

awk 'NF' data.txt

そして

awk 'length' data.txt

これらをコマンドの最初に置くだけで、つまり、

awk -v variable=$bashvariable 'NF { print variable ... }' myinfile

または

awk -v variable=$bashvariable 'length { print variable  ... }' myinfile

これらは両方とも、ゲートキーパー/ ifステートメントとして機能します。

最初のアプローチは、フィールド数(NF)がゼロでない(つまり、ゼロより大きい)行のみを出力することで機能します。

2番目の方法は行の長さを調べ、長さがゼロでない(つまり、ゼロより大きい)場合に動作します。

データ/ニーズに最適なアプローチを選択できます。

47
Levon

あなたは追加することができます

/^\s*$/ {next;}  

空白行に一致し、残りのawk一致ルールをスキップするスクリプトの前に。すべてをまとめる:

awk -v variable=$bashvariable '/^\s*$/ {next;} {print variable"\t single\t" $0"\t double"}' myinfile.c
9
beny23

あなたはこれを試すことができるかもしれません:

awk -v variable=$bashvariable  '$0{print variable"\t single\t" $0"\t double"}' myinfile.c
2
Kent

これを試して:

awk -v variable=$bashvariable '/^.+$/{print variable"\t single\t" $0"\t double"}' myinfile.c
1
Mithrandir