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

관련 정보