두 행의 차이점을 찾아 추가하세요.

두 행의 차이점을 찾아 추가하세요.

열을 함께 추가하는 데 사용하고 싶지만 awk최대 1개의 열과 특정 열만 추가할 수 있습니다.

이것이 제가 사용하고 있는 입력 파일의 모습입니다.

1   119 .   A   T   1000    PASS    MID=183;S=0;DOM=0.5;PO=1;GO=337;MT=1;AC=3;DP=1000;MULTIALLELIC  GT  0|0 1|0 0|0 0|0
1   119 .   A   T   1000    PASS    MID=362;S=0;DOM=0.5;PO=1;GO=562;MT=1;AC=2;DP=1000;MULTIALLELIC  GT  0|0 1|0 0|1 0|0

내가 원하는 모습

1   119 .   A   T   1000    PASS    MID=183;S=0;DOM=0.5;PO=1;GO=337;MT=1;AC=5;DP=1000   GT  0|0 1|0 0|1 0|0

따라서 추가해야 할 유일한 열은 AC=#과 0과 1입니다. 내가 겪고 있는 문제는 텍스트가 있는 줄과 두 값이 모두 1인 줄(결과가 1이 되기를 원함)을 처리하고 파일 중간에 구분 기호를 변경하는 것입니다.

불행 하게도 지금까지는 awk 'NR%2 { split($0, a) ; next } { for (i=1; i<=NF; i++) printf " %d", a[i]+$i ; print "" } ' 텍스트가 0으로 변환되고 ;, | 및 탭 문자가 출력되지 않습니다.

답변1

당신의 책상은 다루기 어렵다, 그러나 이를 수행하는 한 가지 방법은 작업을 여러 단계로 나누는 것입니다. 먼저 데이터를 이름이 지정된 파일에 저장한 data.txt후 다음을 수행합니다.

  • 테이블을 고정 너비 열로 변환하고 공백 " ", 등호 =및 콜론을 열로 바꿉니다. 다음과 같이 합계에 함수를 결합하여 이를 달성할 수 있습니다.";""\t"sedawk

sed 's/=/\t/g; s/;/\t/g' data.txt | awk '{printf "%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33}'

산출:

1      119   .     A     T     1000  PASS  MID   183   S     0     DOM   0.5   PO    1     GO    337   MT    1    AC    3     DP    1000  MULTIALLELIC GT    0|0   1|0   0|0   0|0        
1      119   .     A     T     1000  PASS  MID   362   S     0     DOM   0.5   PO    1     GO    562   MT    1    AC    2     DP    1000  MULTIALLELIC GT    0|0   1|0   0|1   0|0  
  • 귀하의 경우 열 번호에서 특정 열의 값을 합산하십시오 #21. 이전 단계의 출력을 다음 명령으로 파이프하면 됩니다.

awk '{ sum21+=$21} END {print sum21}')

산출:

5

- 다음을 사용하여 테이블에서 첫 번째 행을 추출합니다.

sed 's/=/\t/g; s/;/\t/g' data.txt| awk '{printf "%-5s  %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33}' | head -1

산출:

1      119   .     A     T     1000  PASS  MID   183   S     0     DOM   0.5   PO    1     GO    337   MT    1    AC    3     DP    1000  MULTIALLELIC GT    0|0   1|0   0|0   0|0        

field #21- 다음과 같이 이전 단계의 값을 원래 테이블의 sum-value열 21의 값 으로 바꿉니다.reconstruct the spaces, colons and the other symbols

awk '{print $1,$2,$3,$4,$5,$6,$7,$8"="$9";"$10"="$11";"$12"="$13";"$14"="$15";"$16"="$17";"$18"="$19";"$20,"=",$21='$sum'";"$22"="$23";"$24,$25,$26,$27,$28,$29,$30,$31,$32,$33}'

산출:

1 119 . A T 1000 PASS MID=183;S=0;DOM=0.5;PO=1;GO=337;MT=1;AC = 5;DP=1000;MULTIALLELIC GT 0|0 1|0 0|0 0|0    

Bash에서는 다음과 같이 할 수 있습니다:

#!/bin/bash
sum_col21=$(sed 's/=/\t/g; s/;/\t/g' data.txt| awk '{printf "%-5s  %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33}' | awk '{ sum21+=$21} END {print sum21}')

first_row=$(sed 's/=/\t/g; s/;/\t/g' data.txt| awk '{printf "%-5s  %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33}' | head -1)


echo $first_row | awk '{print $1,$2,$3,$4,$5,$6,$7,$8"="$9";"$10"="$11";"$12"="$13";"$14"="$15";"$16"="$17";"$18"="$19";"$20,"=",$21='$sum_col21'";"$22"="$23";"$24,$25,$26,$27,$28,$29,$30,$31,$32,$33}'

질문 텍스트에 필요한 추가 설명을 포함하여 솔루션이 업데이트됩니다.

관련 정보