awk で 2 つの行間で同じ列を減算する

awk で 2 つの行間で同じ列を減算する

2行目と1行目を減算したいのですが、ファイルは次のようになります

tmptxt

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

望ましい出力は

8 6 4 2

これをawkでどうやってやるのでしょうか?

1 列のみの出力に成功しました:

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 -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

関連情報