Заполните пустую строку в столбце на основе соответствия между двумя другими столбцами

Файл а.txt:

snp chr pos effect noneffect eaf beta se pval pval pval chr:1 1 101 A G 0.3 -0.04 0.03 0.1 0.44 0.936 chr:1 1 1000 B L 0.01 0.03 0.8 0.427 0.6804

Некоторые строки из а.txt могут пропустить значения $6 (например, вторая строка). Файл b.txt

101 0.1 1000 0.2

Я ищу способ заменить $6 на a.txt на $2 с b.txt

Я попробовал следующую команду которая не решила проблему:

awk '$6 {print $3,$6} !$6 {print $3,$2}' b.txt a.txt awk 'NR==FNR{a[$1];next}$3 in a{print}' b.txt a.txt

Как я могу ее решить?

1
задан 26 September 2017 в 13:00

3 ответа

Если вы можете использовать количество полей NF, чтобы определить, отсутствует ли $6, вы можете сделать

awk 'NR==FNR {a[$1]=$2; next} NF<11 {$6 = a[$3] OFS $6} {print}' b.txt a.txt

Если вы хотите префикс вывода, пропустите его через column -t :

$ awk 'NR==FNR {a[$1]=$2; next} NF<11 {$6 = a[$3] OFS $6} {print}' b.txt a.txt | column -t
SNP               CHR  POS    EFFECT_ALLELE  NON_EFFECT_ALLELE  EAF       BETA        SE         PVALUE    INFO      HWE
chr:1:10177:AC:A  1    10177  A              AC                 0.376827  -0.0447626  0.0316126  0.156783  0.422784  0.936182
chr:1:10352:TA:T  1    10352  T              TA                 0.43176   0.00727013  0.0309617  0.814356  0.427932  0.680802
3
ответ дан 22 May 2018 в 18:46

Если вы можете использовать количество полей NF, чтобы определить, отсутствует ли $6, вы можете сделать

awk 'NR==FNR {a[$1]=$2; next} NF<11 {$6 = a[$3] OFS $6} {print}' b.txt a.txt

Если вы хотите префикс вывода, пропустите его через column -t :

$ awk 'NR==FNR {a[$1]=$2; next} NF<11 {$6 = a[$3] OFS $6} {print}' b.txt a.txt | column -t SNP CHR POS EFFECT_ALLELE NON_EFFECT_ALLELE EAF BETA SE PVALUE INFO HWE chr:1:10177:AC:A 1 10177 A AC 0.376827 -0.0447626 0.0316126 0.156783 0.422784 0.936182 chr:1:10352:TA:T 1 10352 T TA 0.43176 0.00727013 0.0309617 0.814356 0.427932 0.680802
3
ответ дан 18 July 2018 в 07:23

Если вы можете использовать количество полей NF, чтобы определить, отсутствует ли $6, вы можете сделать

awk 'NR==FNR {a[$1]=$2; next} NF<11 {$6 = a[$3] OFS $6} {print}' b.txt a.txt

Если вы хотите префикс вывода, пропустите его через column -t :

$ awk 'NR==FNR {a[$1]=$2; next} NF<11 {$6 = a[$3] OFS $6} {print}' b.txt a.txt | column -t SNP CHR POS EFFECT_ALLELE NON_EFFECT_ALLELE EAF BETA SE PVALUE INFO HWE chr:1:10177:AC:A 1 10177 A AC 0.376827 -0.0447626 0.0316126 0.156783 0.422784 0.936182 chr:1:10352:TA:T 1 10352 T TA 0.43176 0.00727013 0.0309617 0.814356 0.427932 0.680802
3
ответ дан 24 July 2018 в 18:47

Другие вопросы по тегам:

Похожие вопросы: