열을 함께 추가하는 데 사용하고 싶지만 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"
sed
awk
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}'
질문 텍스트에 필요한 추가 설명을 포함하여 솔루션이 업데이트됩니다.