С вашей таблицей очень сложно работать , но один из способов сделать это — разбить работу на несколько шагов. Прежде всего сохраните свои данные в файле с именем 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}'
Это решение будет обновлено после дополнительных необходимых пояснений в тексте вопроса.
Это связано с SELinux. Я рекомендую прочитать, как правильно переименовать каталог для общего ресурса samba с помощью SELinux.