입력 파일은 "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
. 아래 코드에서는 숫자를 a
sum 에 저장합니다 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는 필드와 첫 번째 레코드 간의 차이를 계산합니다.