Como remover a vírgula e imprimir a linha inteira novamente para as palavras colocadas após a vírgula

1

Arquivo:

chr1_156186369  chr1_156186369_A_C,T    A   C,T  33150.29  1/2:0,4,6:10:88:272
chr19_27732257  chr19_27732257_G_C      G   C    262.29    1/2:1,10,7:18:99:414,167
chrM_2619       chrM_2619_A_G,T         A   G,T  33023.29  1/2:0,5,5:10:99:293,144,129
chr9_119375271  chr9_119375271_T_A,G    T   A,G  248.29    1/2:1,11,5:17:99:359,107,113

Eu preciso remover a vírgula da coluna 2 e 4 somente e imprimir a linha inteira para as palavras colocadas após a vírgula.

A saída esperada é:

chr1_156186369  chr1_156186369_A_C  A   C   33150.29  1/2:0,4,6:10:88:272
chr1_156186369  chr1_156186369_A_T  A   T   33150.29  1/2:0,4,6:10:88:272 
chr19_27732257  chr19_27732257_G_C  G   C   262.29    1/2:1,10,7:18:99:414,167
chrM_2619       chrM_2619_A_G       A   G   33023.29  1/2:0,5,5:10:99:293,144,129
chrM_2619       chrM_2619_A_T       A   T   33023.29  1/2:0,5,5:10:99:293,144,129
chr9_119375271  chr9_119375271_T_A  T   A   248.29    1/2:1,11,5:17:99:359,107,113
chr9_119375271  chr9_119375271_T_G  T   G   248.29    1/2:1,11,5:17:99:359,107,113 

Eu tentei o awk mas não obtive nenhum resultado, também li o tipo semelhante de pergunta aqui   Como extrair linha do arquivo em uma condição específica

    
por user6681622 07.11.2016 / 11:19

4 respostas

0

Eu não sei como fazer isso com um único comando, mas funciona com esse loop em bash :

cat data.dat | while read line
do
  if echo "${line}" | grep -q '[[:alpha:]],[[:alpha:]]'
  then
    letters='echo "${line}" | grep -o '[[:alpha:]],[[:alpha:]]' | head -n 1'
    for letter in 'echo ${letters} | sed 's/,/ /g''
    do
      echo "${line}" | sed 's/'"${letters}"'/'"${letter}"'  /g'
    done
  else
    echo "${line}"
  fi
done
    
por 07.11.2016 / 11:56
2

Usando o awk:

awk '{
  split ($2,w2,",");
  split ($4,w4,",");
  for (i in w4) {
    print $1,substr(w2[1],0,length(w2[1])-length(w4[i])) w4[i],$3,w4[i],$5,$6;
  }}'

Note que não há tratamento de erros no caso de os valores após a vírgula não serem iguais para as colunas 2 e 4.

    
por 07.11.2016 / 12:34
1

Com sed assumindo que os valores separados de caractere único, como C,T , são repetidos

$ sed -E 's/^(.*)([A-Z]),([A-Z])(.*),(.*)/\n/' ip.txt 
chr1_156186369  chr1_156186369_A_C    A   C  33150.29  1/2:0,4,6:10:88:272
chr1_156186369  chr1_156186369_A_T    A   T  33150.29  1/2:0,4,6:10:88:272
chr19_27732257  chr19_27732257_G_C      G   C    262.29    1/2:1,10,7:18:99:414,167
chrM_2619       chrM_2619_A_G         A   G  33023.29  1/2:0,5,5:10:99:293,144,129
chrM_2619       chrM_2619_A_T         A   T  33023.29  1/2:0,5,5:10:99:293,144,129
chr9_119375271  chr9_119375271_T_A    T   A  248.29    1/2:1,11,5:17:99:359,107,113
chr9_119375271  chr9_119375271_T_G    T   G  248.29    1/2:1,11,5:17:99:359,107,113
  • ^(.*) texto inicial
  • ([A-Z]),([A-Z]) caracteres únicos separados por vírgula
  • (.*) texto entre a repetição
  • , corresponde aos caracteres únicos separados por vírgula novamente
  • (.*) restante da linha
  • \n exigiu o formato de saída
  • Observe que o espaçamento não corresponde exatamente ao resultado esperado
por 07.11.2016 / 14:38
0

Divida o quarto campo na vírgula e use as fatias nessa coluna, além de substituir o último _X,Y em _slice , se houver:

awk '{
      n=split($4,slices,",")
      for(i=1;i<=n;i++) {
        res=$2
        sub(/.,.*/,slices[i],res)
        print $1, res, $3, slices[i], $5, $6
      }
     }' file

Eu não gosto muito de como eu imprimo os campos, já que eu indico do 1º ao 6º, então espero que isso seja estático.

$ awk '{n=split($4,slices,","); for(i=1;i<=n;i++) {res=$2; sub(/.,.*/,slices[i],res); print $1, res, $3, slices[i], $5, $6}}' a
chr1_156186369 chr1_156186369_A_C A C 33150.29 1/2:0,4,6:10:88:272
chr1_156186369 chr1_156186369_A_T A T 33150.29 1/2:0,4,6:10:88:272
chr19_27732257 chr19_27732257_G_C G C 262.29 1/2:1,10,7:18:99:414,167
chrM_2619 chrM_2619_A_G A G 33023.29 1/2:0,5,5:10:99:293,144,129
chrM_2619 chrM_2619_A_T A T 33023.29 1/2:0,5,5:10:99:293,144,129
chr9_119375271 chr9_119375271_T_A T A 248.29 1/2:1,11,5:17:99:359,107,113
chr9_119375271 chr9_119375271_T_G T G 248.29 1/2:1,11,5:17:99:359,107,113
    
por 07.11.2016 / 12:15

Tags