awk中兩行之間減去同一列

awk中兩行之間減去同一列

我想用第一行減去第二行。文件是這樣的

臨時檔案

A B 1 2 3 4 
C D 9 8 7 6

期望的輸出是

8 6 4 2

如何在 awk 中做到這一點?

我設法僅輸出一列:

awk '{$temp=$3-prev3; prev3=$3}{print $temp}'

答案1

解決方案與awk

awk '
    NR==1 {split($0,a)}
    NR==2 {split($0,b)}
    END {for(i=1;i<=NF;i++) printf "%d ", b[i]-a[i]}
' input.txt

給出結果

0 0 8 6 4 2

由於 awk 在算術運算期間將沒有有效數字的字串解釋為 0,因此如果您想要刪除來源欄位包含非數字值的結果,可以透過新增附加條件來實現。

awk '
    NR==1 {split($0,a)}
    NR==2 {split($0,b)}
    END {
        for(i=1;i<=NF;i++)
        if(a[i] ~ /^[0-9]+$/ && b[i] ~ /^[0-9]+$/)
        printf "%d ", b[i]-a[i]
    }
' input.txt

給出結果

8 6 4 2

答案2

選擇Python解決方案:

python -c 'import sys; f=open(sys.argv[1],"r"); 
print(" ".join(str(int(d2)-int(d1)) 
for d1,d2 in zip(next(f).split()[2:], next(f).split()[2:]))); f.close()' file

輸出:

8 6 4 2

答案3

下面的命令也提供相同的輸出。 l.txt 包含您提供的相關輸入

for i in {1..6}; do awk -v i="$i" 'BEGIN{sum=0}{sum=$i-sum}END{print sum}' l.txt ; done| tr "\n" " " | awk '{$1="";$2="";print $0}' | sed "s/^ //g"

輸出

8 6 4 2

相關內容