É 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
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'.
É 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
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!