フィールド値から改行を削除するには、次のコマンドを使用しています。このコマンド例は、3つの属性を持つファイルに対して生成されました。
awk -F\| '{while(NF<3 && getline p)$0=$0 p}1'
入力ファイルの属性数が異なるため、AWKコマンドで属性値の数をパラメータ化したいと思います。以下を試しましたが、エラーが発生しました。
NoAttributes=12
awk -F\| '{while(NF<$NoAttributes && getline p)$0=$0 p}1'
エラー情報:
awk:フィールドが無効です。
行番号1を入力してください。
ソース行番号は 1 です。
答え1
awk
コマンドラインで変数を設定するには-v variable=value
:
awk -v attrs=2 '{ ... NF < attrs && ... }'
ENVIRON["variable"]
以下を使用して環境変数にアクセスすることもできますawk
。
export attrs=2
awk '{ ... NF < ENVIRON["attrs"] && ... }'
または、
attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'
または、
env attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'
最後の2つのバリエーションはattrs
呼び出し環境に設定されておらず、awk
プログラム(および起動できるすべてのプロセス)に対してのみ設定されます。
3番目のメソッドはvariable=value
"filename"引数として提供されます。
awk '...' msg="hello" file1 file2 msg="good bye" file3 file4
ファイル処理を開始する前にawk
変数を文字列に設定してくださいmsg
。値が処理されるように変更されるまで値を保持します。このように設定された変数は、コードのどのブロックでも使用できません。hello
file1
good bye
file3
BEGIN
awk
awk
コードを構成する文字列の変数拡張を介してシェル変数をコードに直接挿入することは、awk
データをプログラムに転送する良い方法ではないため、避けるべきです。