[英]Loop awk math over all columns
我有一個awk腳本,在該腳本中我對文件進行了一些算術運算,並希望在文件的所有列上循環方程式。 當我將方程式僅應用到一個奇異的列時,它可以工作,但是我嘗試循環它失敗,並且將結果錯誤地輸出到同一列(我希望將其保留在單獨的列中)。 我有效的單數列方程是:
#!/bin/awk -f
BEGIN {
}
{
if(NR == 1) {
blank = $1
}
if(NR == 2) {
zero = $1
}
base = zero - blank;
if(NR > 3) {
print (($1 - blank)/base) >> "data.txt"
}
}
END {
}
輸入:
10
20
30
40
50
產量
2
3
4
我嘗試對多列進行操作:
#!/bin/awk -f
BEGIN {
}
{
for(i = 1; i <= NF; i++) {
if(NR == 1) {
blank = $i
}
if(NR == 2) {
zero = $i
}
base = zero - blank;
if(NR > 3) {
print (($i - blank)/base) >> "data.txt"
}
}
}
END {
}
輸入:
10 60
20 70
30 80
40 90
50 100
輸出:
-2
3
-1
4
預期產量:
2 2
3 3
4 4
另外,嘗試遍歷所有列時,我無法像我想要的那樣僅輸出結果以覆蓋原始文件,因為它將添加越來越多的內容並創建無限循環。 在上面,我必須輸出到另一個文件,但是我想用結果覆蓋原始文件。
如果您的測試用例輸出錯誤,則可能是您要查找的內容(每列相同的公式):
$ awk 'NR==1{split($0,b);next}
NR==2{split($0,z);next}
{for(i=1;i<=NF;i++) printf "%s", ($i-b[i])/(z[i]-b[i]) OFS;
print ""}' file
會給你
2 2
3 3
4 4
seq 10 10 100 | pr -2Ts" " | awk '
NR == 1 {blank = $1}
NR == 2 {zero = $1}
NR >= 3 {
for (i=1; i<=NF; i++)
$i = ($i - blank) / (zero - blank)
print
}
'
2 7
3 8
4 9
您需要注意需要在那些名字奇異的變量中捕獲哪個字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.