2017-04-05 105 views
-1

我有4列數據文件,大約有100行。我想從第(n + 3)行中減去第n個值,並在新列中打印這些值($ 5)。列數據對於每列不具有規則模式。如何從awk中的第(n + 3)行減去第n個?

我的示例文件:

cat input 
1 2 3 20 
1 2 3 10 
1 2 3 5 
1 2 3 20 
1 2 3 30 
1 2 3 40 
1 2 3 . 
1 2 3 . 
1 2 3 . (and so on) 

輸出應該是:

1 2 3 20 0 #(20-20) 
1 2 3 10 20 #(30-10) 
1 2 3 5 35 #(40-5) 
1 2 3 20 ? #(. - 20) 
1 2 3 30 ? #(. - 30) 
1 2 3 40 ? #(. - 40) 
1 2 3  . 
1 2 3  . 
1 2 3  . (and so on) 

我如何能做到這一點的AWK? 謝謝

+1

你現在在做最多? – 123

+0

我試過getline和數組,但我無法解決它。 – Radioactive

+0

顯示你做了什麼,人們可以幫助你。 – 123

回答

1

爲此,我認爲最簡單的事情是通過文件兩次通讀。第一次(NR==FNR塊)我們將所有第四列值保存在由行號索引的數組中。下一個塊被執行第二遍,並創建一個具有所需計算的第五列(首先檢查以確保我們不會傳遞文件末尾)。

$ cat input 
1 2 3 20 
1 2 3 10 
1 2 3 5 
1 2 3 20 
1 2 3 30 
1 2 3 40 

$ awk 'NR==FNR{a[NR]=$4; last=NR; next} {$5 = (FNR+3 <= last ? a[FNR+3] - $4 : "")}1' input input 
1 2 3 20 0 
1 2 3 10 20 
1 2 3 5 35 
1 2 3 20 
1 2 3 30 
1 2 3 40 
+0

這有效......我認爲FNR的想法是完美的。多謝兄弟。 – Radioactive

0

可以使用tac + awk + tac做到這一點:

tac input | 
awk '{a[NR]=$4} NR>3 { $5 = (a[NR-3] ~ /^[0-9]+$/ ? a[NR-3] - $4 : "?") } 1' | 
tac | column -t 

1 2 3 20 0 
1 2 3 10 20 
1 2 3 5 35 
1 2 3 20 ? 
1 2 3 30 ? 
1 2 3 40 ? 
1 2 3 . 
1 2 3 . 
1 2 3 . 
相關問題