Wie kann ich die Anzahl der wissenschaftlichen Zahlen in einer Datei zählen? Die Datei hat auch einige Kopfzeilen, die übersprungen werden müssen.
Unten finden Sie einen Teil des Dateiinhalts.
FileHeaderLine1
FileHeaderLine2
FileHeaderLine3
FileHeaderLine4
2.91999996E-001 2.97030300E-001 3.02060604E-001 3.07090908E-001 3.12121212E-001 3.17151517E-001
3.22181821E-001 3.27212125E-001 3.32242429E-001 3.37272733E-001 3.42303038E-001 3.47333342E-001
3.52363646E-001 3.57393950E-001 3.62424254E-001 3.67454559E-001 3.72484863E-001 3.77515137E-001
3.82545441E-001 3.87575746E-001 3.92606050E-001 3.97636354E-001 4.02666658E-001 4.07696962E-001
4.12727267E-001 4.17757571E-001 4.22787875E-001 4.27818179E-001 4.32848483E-001 4.37878788E-001
4.42909092E-001 4.47939396E-001 4.52969700E-001
Wie kann ich also die ersten vier Zeilen des obigen Beispiels überspringen und die Anzahl der wissenschaftlichen Zahlen in der Datei zählen?
Antwort1
Mit dem Kernmodul Scalar::Util
können Sie Folgendes tun:
$ perl -MScalar::Util=looks_like_number -anle '
$count += grep { looks_like_number($_) } @F;
END { print $count }
' file
33
Mehr dazu looks_like_number
erfahren Sie unter perldoc perlapi
.
Antwort2
Verwenden von GNU grep
Sie können grep
hierfür die PCRE-Funktionen verwenden. Dasselbe Muster kann übrigens auch in Perl verwendet werden:
$ grep -oP '\d+E[-+]?\d+' file.txt | wc -l
33
Sie können es auch wc -w
zum Zählen von Wörtern verwenden. Ich zähle oben Zeilen, aber es grep
gibt eine einzelne Übereinstimmung pro Zeile zurück, sodass es in diesem Szenario nicht wirklich wichtig ist.
Perl verwenden
Für Perl könnten Sie diesen Einzeiler verwenden:
$ perl -lane '$c += grep /\d+E[-+]?\d+/, @F; END { print $c; }' file.txt
33
Verweise
Antwort3
egrep
wird funktionieren:
egrep "[0-9].[0-9]E-[0-9]" YourFile | wc -w
AKTUALISIEREN:
Wenn eine Zeile zufällig sowohl eine Zahl als auch eine andere Zeichenfolge enthält, können wir awk
das Problem folgendermaßen lösen:
awk -F' ' '{for(i=1;i<=NF;i++)if(!(i%1))$i=$i "\n"}1' YourFile | egrep "[0-9].[0-9]E-[0-9]" | wc -w ( or wc -l )
Antwort4
Wenn Sie einfach nur die Anzahl derDurch Leerzeichen getrennte FelderWenn Sie den Headerzeilen in Perl folgen, können Sie meiner Meinung nach einfach Folgendes tun:
perl -lane '$sum += $#F+1 if $. > 4; END{print $sum}' file
Wenn Sie wirklich nur wissenschaftlich formatierte Zahlen zählen müssen, dann könnte ein Ansatz darin bestehen, Zahlen zu suchen und zu ersetzen gemäßein passender regulärer Ausdruckund dann die Anzahl der Ersetzungen zählen (der Perl-Substitutionsausdruck gibt die Anzahl der Ersetzungen zurück, wenn Sie ihn an eine Variable binden)
perl -lane '$sum += s/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?//g if $. > 4; END{print $sum}' file