Verwenden von Perl zum Zählen der Anzahl wissenschaftlicher Zahlen in einer Datei

Verwenden von Perl zum Zählen der Anzahl wissenschaftlicher Zahlen in einer Datei

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::Utilkö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_numbererfahren Sie unter perldoc perlapi.

Antwort2

Verwenden von GNU grep

Sie können grephierfü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 -wzum Zählen von Wörtern verwenden. Ich zähle oben Zeilen, aber es grepgibt 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

egrepwird 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 awkdas 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

verwandte Informationen