入力ファイルは「id number1 number2 count」行で、number1とnumber2の両方が昇順です。
Barcode000000 48521 1855 0
Barcode000001 48621 1855 0
Barcode000002 48721 1855 1
Barcode000003 48821 1855 0
Barcode000004 48921 1955 20
Barcode000005 49021 1955 0
今私はそれを使用しますawk -v bin=100 '{print ($2-48521)/bin" "($3-1855)/bin" "$4}'
。
入力ファイルの最初の行で合計をどのように設定しますか48521
?1855
ベストアンサー1
変数に保存して、その変数が何であるかを覚えてから、その変数を使用して新しいフィールドを計算します。特殊変数が1なので、最初のレコード(行)を見ていることがわかりますNR
。以下のコードは、数値をa
sumに保存しますb
。
$ awk -v bin=100 'NR == 1 { a = $2; b = $3 } { $2 = ($2 - a)/bin; $3 = ($3 - b)/bin; print }' file
Barcode000000 0 0 0
Barcode000001 1 0 0
Barcode000002 2 0 1
Barcode000003 3 0 0
Barcode000004 4 1 20
Barcode000005 5 1 0
テスト前のブロックはNR == 1
最初のレコードに対してのみ実行され、2番目のブロックは条件なしですべてのレコードに対して実行されます。
または、最初のフィールドがない場合(これはコードの出力結果に近いです):
$ awk -v bin=100 'NR == 1 { a = $2; b = $3 } { print ($2 - a)/bin, ($3 - b)/bin, $4 }' file
0 0 0
1 0 0
2 0 1
3 0 0
4 1 20
5 1 0
デフォルトの出力フィールド区切り文字は単一のスペースであるため、コンマを使用して出力レコードのフィールドを区切る場合はスペースを挿入する必要はありません。出力区切り記号は、特殊変数の値を設定することで変更できますOFS
。