2行の違いを見つけて追加してください。

2行の違いを見つけて追加してください。

列を一緒に追加するために使用したいのですが、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 "" } ' テキストがゼロに変換されています。とタブ文字は出力されません。

ベストアンサー1

あなたの机は扱いにくいしかし、これを行う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}'

質問テキストに必要な追加の説明を含むソリューションが更新されます。

おすすめ記事