awk를 사용하여 첫 번째 행의 열 값을 빼는 방법은 무엇입니까?

awk를 사용하여 첫 번째 행의 열 값을 빼는 방법은 무엇입니까?

입력 파일은 "id number1 number2 count" 행이고 number1과 number2가 모두 오름차순입니다.

Barcode000000 48521 1855 0
Barcode000001 48621 1855 0
Barcode000002 48721 1855 1
Barcode000003 48821 1855 0
Barcode000004 48921 1955 20
Barcode000005 49021 1955 0

이제 나는 그것을 사용합니다 awk -v bin=100 '{print ($2-48521)/bin" "($3-1855)/bin" "$4}'.

입력 파일의 첫 번째 줄에서 합계를 어떻게 설정합니까 48521?1855

답변1

변수에 저장하여 해당 변수가 무엇인지 기억한 다음 해당 변수를 사용하여 새 필드를 계산합니다. 특수변수가 1이기 때문에 첫 번째 레코드(행)를 보고 있음을 알 수 있습니다 NR. 아래 코드에서는 숫자를 asum 에 저장합니다 b.

$ awk -v bin=100 'NR == 1 { a = $2; b = $3 } { $2 = ($2 - a)/bin; $3 = ($3 - b)/bin; print }' file
Barcode000000 0 0 0
Barcode000001 1 0 0
Barcode000002 2 0 1
Barcode000003 3 0 0
Barcode000004 4 1 20
Barcode000005 5 1 0

테스트 전 블록은 NR == 1첫 번째 레코드에 대해서만 실행되고, 두 번째 블록은 조건 없이 모든 레코드에 대해 실행됩니다.

또는 첫 번째 필드가 없는 경우(이는 코드의 출력 결과에 더 가깝습니다):

$ awk -v bin=100 'NR == 1 { a = $2; b = $3 } { print ($2 - a)/bin, ($3 - b)/bin, $4 }' file
0 0 0
1 0 0
2 0 1
3 0 0
4 1 20
5 1 0

기본 출력 필드 구분 기호는 단일 공백이므로 쉼표를 사용하여 출력 레코드의 필드를 구분하는 경우 공백을 삽입할 필요가 없습니다. 출력 구분 기호는 특수 변수의 값을 설정하여 변경할 수 있습니다 OFS.

답변2

awk를 사용하십시오.

$ awk -v bin=100 'NR==1{split($0,a)} {for (i=2;i<=3;i++) $i=($i-a[i])/100} 1' file
Barcode000000 0 0 0
Barcode000001 1 0 0
Barcode000002 2 0 1
Barcode000003 3 0 0
Barcode000004 4 1 20
Barcode000005 5 1 0

또는 특정 필드의 작은 집합만 인쇄하려는 경우:

$ awk -v bin=100 'NR==1{split($0,a)} {for (i=2;i<=3;i++) $i=($i-a[i])/100; print $2, $3, $4}' file
0 0 0
1 0 0
2 0 1
3 0 0
4 1 20
5 1 0

또는 필드가 많지만 첫 번째 필드를 인쇄하고 싶지 않은 경우:

$ awk -v bin=100 'NR==1{split($0,a)} {for (i=2;i<=3;i++) $i=($i-a[i])/100; $1=""; sub(OFS,"")} 1' file
0 0 0
1 0 0
2 0 1
3 0 0
4 1 20
5 1 0

답변3

사용밀러( mlr):

$ bin=100
$ mlr --nidx step -a from-first -f 2,3 then put '$2 = ${2_from_first} / '$bin' ; $3 = ${3_from_first}/ '$bin'; unset  ${2_from_first}, ${3_from_first}' file
Barcode000000 0 0 0
Barcode000001 1 0 0
Barcode000002 2 0 1
Barcode000003 3 0 0
Barcode000004 4 1 20
Barcode000005 5 1 0

또는 첫 번째 필드가 없습니다.

$ bin=100
$ mlr --nidx step -a from-first -f 2,3 then put '$2 = ${2_from_first} / '$bin' ; $3 = ${3_from_first}/ '$bin'; unset $1, ${2_from_first}, ${3_from_first}' file
0 0 0
1 0 0
2 0 1
3 0 0
4 1 20
5 1 0

step하위 명령에 관해서밀러 문서:

계산은 이전/나중에 기록된 값에 따라 달라지며 선택적으로 범주별로 그룹화됩니다.

from-first는 필드와 첫 번째 레코드 간의 차이를 계산합니다.

관련 정보