Excluindo o fim da linha se a coluna começar com caractere

1

Eu tenho um arquivo grande, onde a segunda coluna tem algumas linhas que precisam ser truncadas. Atualmente é:

10 10:135524264:C:G 0 135524264 C G
10 rs55726203:135524334:A:G 0 135524334 A G

Se a coluna second começar com ' rs ', preciso excluir tudo depois dos dois pontos dessa coluna. Então eu preciso que a saída seja:

10 10:135524264:C:G 0 135524264 C G
10 rs55726203 0 135524334 A G

Sou relativamente novo no unix e só posso encontrar perguntas do fórum que segmentem parte do que eu preciso. Eu tenho sed 's/:.*//' para excluir após os dois pontos, mas não consigo descobrir como direcionar isso especificamente para as linhas da segunda coluna que começam com 'rs'.

    
por Stu89 23.03.2018 / 22:14

2 respostas

2

É mais fácil com awk :

awk '$2 ~ /^rs/ {sub(/:.*/,"",$2)} 1' file
10 10:135524264:C:G 0 135524264 C G
10 rs55726203 0 135524334 A G
    
por 23.03.2018 / 22:18
0

Desde que você mencionou sed, aqui está uma maneira de fazer isso. Em geral, navegar para a enésima coluna com o separador S é feito da seguinte maneira: '^ [^ S] * S [^ S] * S ...' com parênteses opcionais em torno de várias partes, se for necessário lembrá-los. Existem outras maneiras, mas desde N = 2, isso fará.

sed -r 's/^([^ ]* )(rs[^ :]*):[^ ]*//' file

Quando chego à segunda coluna, mantenho apenas o que começa com 'rs' e continua com caracteres diferentes do espaço separador e dos dois-pontos. Observe meu ': [^] *' em vez de ':. *', Usado para não excluir as colunas restantes.

Aviso: isso funciona apenas para colunas que não contêm o separador , como seu exemplo. Se você tem células com separador de escape entre aspas, como 'texto "texto texto" texto ", por favor, considere usar uma ferramenta dedicada e não sed ou mesmo awk!

    
por 24.03.2018 / 02:43

Tags