perl -F\s+ -pale '
$. > 1 and /(?:\S+\s+){3}/g and
s{\G(\S+)(\s*)}
{
($1 eq $F[1] ? "S" : $1 eq $F[2] ? "N" : $1 eq "0" ? -1 : $1) . $2
}cge;
' your_genes_file
Opções
-
-F\s+
definirá o FS
para um ou mais espaços em branco = > %código%
-
/\s+/
configurará um loop de leitura de arquivo implícito E a impressão é automática.
-
-p
irá criar novamente cada registro baseado no delimitador de divisão de campo fornecido pela opção -a
ou um espaço solitário por padrão. Os campos são armazenados no array -F
.
-
@F
definirá -l
-
ORS=RS=\n
é o código -e
a ser aplicado a cada registro.
Explicação
Ignoramos a primeira linha do processamento. A opção Perl
terá o cuidado de imprimi-lo. Em seguida, estacionamos nosso marcador de mecanismo de regex no início do quarto campo, pois é onde toda a ação deve começar. Em seguida, aplicamos o comando -p
nos modos s///
, global
e cumulative
. eval
= > O marcador de regex será iniciado a partir de onde foi estacionado no último comando /c
e NÃO desde o início. m//g
= > pesquisaremos toda a linha para transformá-la, e /g
examinará a seção /e
de substituição como um código s//repl/
a ser executado e seus resultados serão estacionados na seção de substituição.
sed GNU
Isso pode ser escrito em Perl
, mas o código fica no caminho da clareza e é deixado como um exercício com moderação.
sed -e '
1b
# fence the column 2 and go looking for col2 matching fields from col 4 onwards
s/\S\+/\n&\n/2
:c2
s/\(\n\(.*\)\n\s\+\S\+\s.*\)\<\>/S/g;tc2
s/\n//g
# fence the column 3 and go looking for col3 matching fields from col 4 onwards
s/\S\+/\n&\n/3
:c3
s/\(\n\(.*\)\n.*\)\<\>/N/g;tc3
s/\n//
# from col 4 onwards look for any lone 0s and change them to -1
:zm1
s/\(\n.*\)\<0\>/-1/;tzm1
s/\n//
' gene_file.dat
Perl
Aqui, removemos qualquer espaço em branco principal que interfira na indexação do array @F e, em seguida, o restabeleça no momento da impressão dos dados. Para o POSIX sed
nós alimentamos os elementos 6 em diante (4 + 2 para espaços em branco) e apenas verificamos se eles são iguais às colunas 2nd / 3rd ou 0.
perl -F'(\s+)' -lane '
print,next if $. == 1;
my $dummy = splice @F, 0, 2 if /^\h/;
print $dummy, @F[0..5], map {
s/^\Q$F[2]\E$/S/ or s/^\Q$F[4]\E$/N/ or s/^0$/-1/; $_
} @F[6 .. $#F];
' gene_file.dat