Este es un archivo parcial
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
En cada línea quiero contar el número total de todos los caracteres que no son "N"
mi deseo de salida
1
1
1
0
1
2
2
text-processing
bioinformatics
Anna1364
fuente
fuente
sed
para reemplazar cosas que no le interesan yawk
para contar la longitud restantesed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
Respuestas:
Solución GNU awk :
FPAT='[^N[:space:]]'
- el patrón que define un valor de campo (cualquier carácter excepto caracteresN
y espacios en blanco)El resultado esperado:
fuente
fuente
awk '{print gsub(/[^ N]/,"")}'
suponiendo que se necesita un recuento para cada línea que no sea el carácter de espacio y
N
tr
es cuántos caracteres fueron reemplazadosc
para complementar el conjunto de caracteres dados-l
opción, elimina el carácter de nueva línea de la línea de entrada para evitar un error fuera de uno y también agrega el carácter de nueva línea para la instrucción de impresiónUna solución más genérica
-a
opción para dividir automáticamente la línea de entrada en espacios en blanco, guardada en una@F
matrizgrep {$_ ne "N"} @F
devuelve una matriz de todos los elementos en los@F
que no coincide con la cadenaN
grep {!/^N$/} @F
scalar
dará un número de elementos de la matrizfuente
Solución alternativa awk :
gsub(...)
- Lagsub()
función devuelve el número de sustituciones realizadas.La salida:
fuente
Otro
awk
enfoque (devolverá -1 para líneas vacías).O en complejo, devolverá -1 en líneas vacías, 0 en líneas de espacios en blanco (tabulaciones / espacios) solamente.
fuente
-1
para líneas vacías ... pero eso podría ser deseable para distinguir una línea compuesta solo de N / espacio frente a una línea vacía ...tr
y script de shell POSIX :bash
`ksh
` yzsh
:fuente
awk '{print length()}'
para evitar el bucle de shell más lento ... pero entonces uno podría hacerlo todo con awk en sí ...awk
bucle es más rápido que el bucle de shell. Pero el shell siempre está en la memoria, yawk
puede que no lo esté: cuandoawk
no está cargado o intercambiado, la sobrecarga de cargarlo ( el tiempo perdido ) puede ser mayor que la ventaja de correrawk
, particularmente en un pequeño lazo. En tales casos, ( es decir, este caso),awk
puede ser más lento .awk
en un script de shell podría hacer que dicho sistema se arrastre a cuatro patas. En general: el mismo arrastre de latencia se aplica a los sistemas con firmware limitado, o cualquier sistema bajo carga pesada.Una breve combinación de
tr
yawk
:Esto elimina todos los espacios y N del archivo de entrada y
awk
solo imprime la longitud de cada línea.fuente
Otra forma fácil es hacerlo en Python, que viene preinstalado en la mayoría de los entornos Unix. Coloque el siguiente código en un archivo .py:
Y luego hacer:
Desde tu terminal. Lo que hace lo anterior es:
fuente