Dies ist eine Teiledatei
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
In jeder Zeile möchte ich die Gesamtzahl aller Zeichen zählen, die nicht "N" sind.
meine Wunschausgabe
1
1
1
0
1
2
2
text-processing
bioinformatics
Anna1364
quelle
quelle
sed
, um Dinge zu ersetzen, die Sie nicht interessieren, undawk
um die verbleibende Länge zu zählensed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
Antworten:
GNU awk Lösung:
FPAT='[^N[:space:]]'
- das Muster, das einen Feldwert definiert (jedes Zeichen außer ZeichenN
und Leerzeichen)Die erwartete Ausgabe:
quelle
quelle
awk '{print gsub(/[^ N]/,"")}'
Angenommen, die Anzahl wird für jede andere Zeile als das Leerzeichen und benötigt
N
tr
gibt an, wie viele Zeichen ersetzt wurdenc
um den angegebenen Zeichensatz zu ergänzen-l
Option, entfernen Sie das Zeilenumbruchzeichen von der Eingabezeile, um Fehler nacheinander zu vermeiden, und fügen Sie das Zeilenumbruchzeichen für die Druckanweisung hinzuEine allgemeinere Lösung
-a
Option zum automatischen Teilen der Eingabezeile in Leerzeichen, die im@F
Array gespeichert sindgrep {$_ ne "N"} @F
Gibt ein Array aller Elemente zurück, in@F
denen die Zeichenfolge nicht übereinstimmtN
grep {!/^N$/} @F
scalar
gibt die Anzahl der Elemente des Arrays anquelle
Alternative awk Lösung:
gsub(...)
- Diegsub()
Funktion gibt die Anzahl der vorgenommenen Ersetzungen zurück.Die Ausgabe:
quelle
Ein anderer
awk
Ansatz (gibt -1 für leere Zeilen zurück).In komplexen Fällen wird -1 in leeren Zeilen und 0 in Leerzeichen (Tabulatoren / Leerzeichen) zurückgegeben.
quelle
-1
für leere Zeilen gedruckt ... aber dann könnte es wünschenswert sein, eine Zeile, die nur aus N / Leerzeichen besteht, von einer leeren Zeile zu unterscheiden ...tr
und POSIX- Shell-Skript:bash
,ksh
Undzsh
:quelle
awk '{print length()}'
, um die langsamere Shell-Schleife zu vermeiden .. aber dann könnte man alles mit awk selbst tun ...awk
Looping ist schneller als Shell - Looping. Die Shell befindet sich jedoch immer im Speicher und istawk
möglicherweise nicht - wenn sieawk
noch nicht geladen oder ausgelagert ist - der Aufwand für das Laden ( die verlorene Zeit ) größer als der Vorteil des Laufensawk
- insbesondere bei kleinen Schleife. In solchen Fällen ( dh in diesem Fall)awk
kann es langsamer sein .awk
in einem Shell-Skript könnte dazu führen, dass ein solches System auf allen Vieren crawlt. Im Allgemeinen gilt der gleiche Latenzwiderstand für Systeme mit eingeschränkter Firmware oder für Systeme unter hoher Last.Eine kurze Kombination von
tr
undawk
:Dadurch werden alle Leerzeichen und Ns aus der Eingabedatei gelöscht und
awk
nur die Länge jeder Zeile gedruckt.quelle
Eine andere einfache Möglichkeit besteht darin, dies in Python zu tun, das in den meisten Unix-Umgebungen vorinstalliert ist. Fügen Sie den folgenden Code in eine .py-Datei ein:
Und dann mache:
Von Ihrem Terminal. Was das Obige tut, ist:
quelle