Este é um arquivo de peça
N W N N N N N N N N N
N C N N N N N N N N N
N A N N N N N N N N N
N N N N N N N N N N N
N G N N N N N N N N N
N C N N N C N N N N N
N C C N N N N N N N N
Em cada linha, quero contar o número total de todos os caracteres que não são "N"
meu desejo de saída
1
1
1
0
1
2
2
text-processing
bioinformatics
Anna1364
fonte
fonte
sed
para substituir coisas que você não se preocupam eawk
para contar o comprimento restantesed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
Respostas:
Solução GNU awk :
FPAT='[^N[:space:]]'
- o padrão que define um valor de campo (qualquer caractere, excetoN
char e espaço em branco)A saída esperada:
fonte
fonte
awk '{print gsub(/[^ N]/,"")}'
assumindo que a contagem é necessária para cada linha que não seja o caractere de espaço e
N
tr
é quantos caracteres foram substituídosc
para complementar o conjunto de caracteres dados-l
opção, retira o caractere de nova linha da linha de entrada para evitar erros de um por um e também adiciona caracteres de nova linha para a instrução printUma solução mais genérica
-a
opção para dividir automaticamente a linha de entrada em espaços em branco, salvos na@F
matrizgrep {$_ ne "N"} @F
retorna a matriz de todos os elementos nos@F
quais não corresponde à stringN
grep {!/^N$/} @F
scalar
dará número de elementos da matrizfonte
Solução alternativa do awk :
gsub(...)
- Agsub()
função retorna o número de substituições feitas.A saída:
fonte
Outra
awk
abordagem (retornará -1 para linhas vazias).Ou no complexo, ele retornará -1 nas linhas vazias, 0 nas linhas de espaços em branco (tabulações / espaços).
fonte
-1
para linhas vazias ... mas, em seguida, que pode ser desejável para distinguir linha composta de apenas N / espaço vs linha vazia ...tr
e shell script POSIX :bash
,,ksh
ezsh
:fonte
awk '{print length()}'
para evitar o shell mais lento looping .. mas, em seguida, pode-se fazer tudo com a própria awk ...awk
loop é mais rápido que o shell. Mas o shell está sempre na memória eawk
pode não estar - quandoawk
ainda não está carregado ou trocado, a sobrecarga de carregá-lo ( o tempo perdido ) pode ser maior que a vantagem de executarawk
- principalmente em um pequeno ciclo. Nesses casos, ( ou seja, neste caso),awk
pode ser mais lento .awk
um script de shell pode fazer com que esse sistema se arraste de quatro. Geralmente: o mesmo arrasto de latência se aplica a sistemas com firmware limitado ou a qualquer sistema com carga pesada.Uma pequena combinação de
tr
eawk
:Isso exclui todos os espaços e Ns do arquivo de entrada e
awk
apenas imprime o comprimento de cada linha.fonte
Outra maneira fácil é fazê-lo em python, que vem pré-instalado na maioria dos ambientes unix. Solte o seguinte código em um arquivo .py:
E então faça:
Do seu terminal. O que o acima faz é:
fonte