簡體   English   中英

awk 訪問變量不止一次

[英]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

要更好地控制浮點格式和間距等,請使用printfOFMT ,如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM