[英]Awk access variable more than once
我試圖多次訪問在 awk 中定義的變量,但它似乎不起作用。
假設我們有一個data.txt
內容:
1 2
2 3
3 4
如果我們使用 awk:
cat data.txt | awk 'sum=($1+$2), div1=(sum/$1) {print " sum: " sum " div1: " div1 " data: " $0}'
它工作正常,我們得到一個輸出
sum: 3 div1: 3 data: 1 2
sum: 5 div1: 2.5 data: 2 3
sum: 7 div1: 2.33333 data: 3 4
如果我嘗試多次訪問sum
,我會收到錯誤
cat data.txt | awk 'sum=($1+$2), div1=(sum/$1), div2=(sum/$2) {print " sum: " sum " div1: " div1 " div2: " div2 " data: " $0}'
即使我將div2=(sum/$2)
更改為div1=(sum/$1)
,這與以前完全相同,我仍然會收到錯誤:
awk: line 1: syntax error at or near ,
如何解決此問題並訪問在 awk 中分配的任何特定變量以多次訪問?
{}
塊之前的部分應該是一個條件。 將變量賦值放在{}
中。 使用;
分隔多個語句 .
cat data.txt | awk '{sum=($1+$2); div1=(sum/$1); div2=(sum/$2); print " sum: " sum " div1: " div1 " div2: " div2 " data: " $0}'
刪除逗號分隔的作業並進一步清理它:
awk '{sum=$1+$2; print "sum:", sum, "div1:", sum/$1, "div2:", sum/$2, "data:", $0}' data.txt
sum: 3 div1: 3 div2: 1.5 data: 1 2
sum: 5 div1: 2.5 div2: 1.66667 data: 2 3
sum: 7 div1: 2.33333 div2: 1.75 data: 3 4
要更好地控制浮點格式和間距等,請使用printf
或OFMT
,如下所示:
awk -v OFMT='%.2g' '{sum=$1+$2; print "sum:", sum, "div1:", sum/$1, "div2:", sum/$2, "data:", $0}' data.txt
sum: 3 div1: 3 div2: 1.5 data: 1 2
sum: 5 div1: 2.5 div2: 1.7 data: 2 3
sum: 7 div1: 2.3 div2: 1.8 data: 3 4
從技術上講,你也可以在模式空間中完成它,只是不那么優雅:
mawk '($4=($3=___=(_=$1)+(__=$+2))\ /_/(1 + 4^-5^2)) \ ($5=___/__/(1 + 4^-5^2))_' CONVFMT='%.10f' OFS='\t'
1 2 3 3.0000000000 1.5000000000
2 3 5 2.5000000000 1.6666666667
3 4 7 2.3333333333 1.7500000000
2^-50
的額外位是強制浮點輸出,但由於它也遠遠超出了輸出精度水平,因此它影響輸出的可能性很小TL;DR
添加接近precision epsilon
的東西
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.