Como deletar uma tabulação entre duas colunas em muitas linhas de texto similares?

0

Eu tenho um documento que estou formatando, contém 1/2 milhão de linhas de texto e são basicamente idênticas ao exemplo abaixo. Preciso deletar a tabulação entre as duas letras, para que isso:

rs207460002 26  15579   T   A
rs207459997 26  15615   G   C
rs527236190 26  15637   T   C

Torna-se assim:

rs207460002 26  15579   TA
rs207459997 26  15615   GC
rs527236190 26  15637   TC

Qualquer solução seria apreciada!

Nota: estas são 5 colunas TAB.

    
por zero786 10.05.2018 / 05:11

5 respostas

2

Outro awk way:

awk '{cpy=$NF; NF--; print $0 cpy }' OFS='\t' infile

Isso tira uma cópia do último campo $NF em uma variável chamada cpy e NF-- exclui o último campo da linha de entrada atual $0 ; Em seguida, estamos imprimindo a linha $0 seguido por cpy . O OFS='\t' especifica o eparador O utput F do campo S .

Ou sed :

sed 's/\t\([A-Z]\)$//' infile

Isso captura um grupo correspondente em \t ab seguido por um único caractere alfabético no final de cada linha com de referência anterior somente ao caractere alfabético correspondente e na peça de substituição manteremos apenas o alfabeto e \t ab removido.

    
por 10.05.2018 / 06:09
1
$ awk '{ print $1 "\t" $2 "\t" $3 "\t" $4 $5 }' input.txt
rs207460002 26  15579   TA
rs207459997 26  15615   GC
rs527236190 26  15637   TC
    
por 10.05.2018 / 05:14
1

Resposta

sed -ri "s/([A-Z])\t([A-Z])$//" your_file

Explicação

-r - Use a regex estendida. (Permitir que alguns caracteres no regex sejam usados sem sequenciamento do espaço)

-i - Mantenha as alterações no arquivo, não as grave em stdout .

s/([A-Z])\t([A-Z])$// - Corresponda [capital_letter][TAB_key][capital_letter] no final da linha e substitua-a por [capital_letter][capital_letter] correspondente.

your_file - Arquivo no qual você deseja que sed funcione.

    
por 10.05.2018 / 06:16
0

Você também pode usar sed

sed -E 's/([A-Z]{1}).*([A-Z]{1})$//' file

Explicação:

  • -E Use expressões regulares
  • ([A-Z]{1}) Constrói o primeiro grupo que contém uma letra maiúscula
  • .* Corresponde tudo dentro dos grupos criados
  • ([A-Z]{1}) Construir o segundo grupo que contém uma letra maiúscula
  • $ A correspondência deve estar no final da linha
  • Substitua pelo primeiro grupo seguido pelo segundo. Isso irá remover tudo dentro das duas letras.
por 10.05.2018 / 06:02
0

Com a ferramenta sed , é trivial:

sed -e 's/\t//4' input_file

Explicação:

  • \t é uma representação para o caractere TAB . Com o GNU sed, tudo bem, o OTW usa um TAB literal.
  • s/\t//4 isto significa apagar a quarta ocorrência do caractere TAB na linha atual.

Com Perl , podemos usar lookarounds:

perl -pe 's/\t(?!.*\t)//'  input_file

Explicação:

  • -p faz o Perl ler em uma base de linha + autoprints as linhas.

  • s/\t(?!.*\t)// regex instrui o Perl a procurar pelo caractere TAB a cuja direita você não pode ver outro TAB, ou seja, é o último TAB. Então essa TAB é deletada.

por 10.05.2018 / 09:02