GNU awk :
awk -v FPAT='[^N[:space:]]' '{ print NF }' file
-
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:
1
1
1
0
1
2
2
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"
minha saída de desejo
1
1
1
0
1
2
2
awk '{ gsub("[ N]",""); print length() }'
assumindo que a contagem é necessária para cada linha diferente do caractere de espaço e N
$ perl -lne 'print tr/N //c' ip.txt
1
1
1
0
1
2
2
tr
é quantos caracteres foram substituídos c
para complementar o conjunto de caracteres fornecidos -l
, elimina o caractere de nova linha da linha de entrada para evitar erros "off-by-one" e também adiciona caracteres de nova linha para a declaração de impressão
Uma solução mais genérica
perl -lane 'print scalar grep {$_ ne "N"} @F' ip.txt
-a
opção para dividir automaticamente a linha de entrada em espaços em branco, salvos em @F
array grep {$_ ne "N"} @F
retorna array de todos os elementos em @F
que não corresponde à string N
grep {!/^N$/} @F
scalar
fornecerá o número de elementos da matriz Solução alternativa awk :
awk '{ print gsub(/[^N[:space:]]/,"") }' file
gsub(...)
- A função gsub()
retorna o número de substituições feitas. A saída:
1
1
1
0
1
2
2
Outra abordagem awk
(retornará -1 para linhas vazias).
awk -F'[^N ]' '$0=NF-1""' infile
Ou no complexo, ele retornará -1 em linhas vazias, 0 somente em linhas de espaços em branco (Tabs / Spaces).
awk -F'[^N \t]+' '$0=NF-1""' infile
tr
e POSIX :
tr -d 'N ' < file | while read x ; do echo ${#x} ; done
bash
, ksh
e zsh
:
while read x ; do x="${x//[ N]}" ; echo ${#x} ; done < file
Uma combinação curta de tr
e awk
:
$ tr -d ' N' <file.in | awk '{ print length }'
1
1
1
0
1
2
2
Isso exclui todos os espaços de um Ns do arquivo de entrada e awk
apenas exibe o tamanho de cada linha.
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:
with open('geno') as f:
for line in f:
count = 0
for word in line.split():
if word != 'N':
count += 1
print(count)
E então faça:
python file.py
Do seu terminal. O que isso faz é: