這麼多的(輕微)的變化同一主題。
awk '
!($1 in a) {a[$1]=$2; next}
{a[$1]-=$2}
END {for (i in a) printf "%s %d\n",i,a[i]}
' input.txt
如果您願意,可將其疊加爲一行。
請記住,awk結構由多個condition { statement }
對組成,因此您可以比使用if..else
更優雅地表達您的需求。 (並不是說這裏就是這種情況 - 這是一個足夠簡單的awk腳本,它可能並不重要,除非你是一個純粹主義者。])
另外,要小心測試值的方式,已經在你的if
的條件下完成了這個問題。請注意,a[$1]
都測試該數組索引處的值是否爲非零值和如果先前不存在,則會使索引存在空值。如果您想檢查索引是否存在,請使用$1 in a
。
更新基於對您的問題評論...
如果你想減去從第一項最後,忽略之間的,那麼你需要保持記錄你的第一個和你的最後一個。像這樣的東西可能就足夠了。
awk '
!($1 in a){a[$1]=$2;next}
{b[$1]=$2}
END {for(i in b)if(i in a)print i,a[i]-b[i]}
' input.txt
請注意,正如埃德提到的,這會產生隨機順序的輸出。如果你想要輸出的順序,你需要一個額外的數組來跟蹤訂單。例如,這將使用順序的項目,首先看出:
awk '
!($1 in a) {
a[$1]=$2;
o[++n]=$1;
next
}
{
b[$1]=$2
}
END {
for (n=1;n<=length(o);n++)
print o[n],a[o[n]]-b[o[n]]
}
' i
注意,所使用的length()
函數來確定數組中元素的數目是不普遍之中AWK的方言,但它確實在兩個工作gawk和one-true-awk(用於FreeBSD等)。
如果第一列中的值重複多次,會發生什麼? – ghoti
在這種情況下,我想採取第一次和最後一次發生 – Vicky
發佈的解決方案都不會這樣做,他們所做的只是爲您提供的2入口示例(除了我的所有內容之外,不必要地將數據的一半保存在數組中然後以隨機順序產生輸出,而不是嚴格按照鍵值讀取的順序進行輸出,這可能或可能不合意)。 –