列を一緒に追加するために使用したいのですが、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"
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}'
質問テキストに必要な追加の説明を含むソリューションが更新されます。