Eu tenho um arquivo com ~ 3 milhões de linhas, aqui estão as primeiras linhas do meu arquivo:
head out.txt
NA
NA
NA
NA
NA
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753,gene85754
gene85752,gene85753,gene85754
gene85752,gene85753,gene85754
gene85752,gene85753,gene85754
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752,gene85753
gene85752
gene85752
Para aquelas linhas que são separadas por ",", eu quero manter tudo depois da primeira vírgula e antes da segunda vírgula. Esta é a minha saída desejada:
outgood.txt
NA
NA
NA
NA
NA
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85752
gene85752
Como
cut
imprime linhas não delimitadas por padrão, o seguinte funcionaIsso usa
awk
para analisar o arquivo como linhas que consistem em campos delimitados por vírgulas.O código detecta quando há mais de um campo em uma linha e, quando há, o primeiro campo é substituído pelo segundo campo. O primeiro campo, não modificado ou modificado pelo código condicional, é então impresso.
Isso imprimirá apenas a primeira string se não houver vírgula, a segunda string se houver uma ou mais vírgulas.
Você pode fazer isso com
Perl
o seguinte.Linha de comando:
Explicação:
-p
lerá os registros linha por linha E imprimirá automaticamente antes de ler o próximo ou eof.-l
fazIRS = ORS = "\n"
-F,
fazFS
uma vírgula.-a
divide cada registro$_
no separador de campo, no nosso caso uma vírgula, e vai em frente e armazena os campos assim gerados no array@F
, que é indexado a zero.-e
implica, o que se segue é oPerl
código, que deve ser aplicado a cada registro.$_ = $F[1] // $_
expressão é a seguinte: se o 2º campo$F[1]
não estiver definido, use o registro atual$_
. E então o resultado desta expressão é atribuído ao registro atual$_
.-p
mudança deperl
estar em uso, antes que o novo registro seja lido, o registro atual é levado parastdout
.Resultado:
Você também pode fazer isso com a versão GNU do
sed
editor, conforme mostrado abaixo: