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

sedpara reemplazar cosas que no le interesan yawkpara 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 caracteresNy 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
Ntres cuántos caracteres fueron reemplazadoscpara complementar el conjunto de caracteres dados-lopció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
-aopción para dividir automáticamente la línea de entrada en espacios en blanco, guardada en una@Fmatrizgrep {$_ ne "N"} @Fdevuelve una matriz de todos los elementos en los@Fque no coincide con la cadenaNgrep {!/^N$/} @Fscalardará 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
awkenfoque (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
-1para 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 ...try 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í ...awkbucle es más rápido que el bucle de shell. Pero el shell siempre está en la memoria, yawkpuede que no lo esté: cuandoawkno 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),awkpuede ser más lento .awken 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
tryawk:Esto elimina todos los espacios y N del archivo de entrada y
awksolo 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