awk
Funzioni di manipolazione delle stringhe
Ricerca…
Sintassi
- indice (grande, piccolo)
- lunghezza o lunghezza ()
- length (stringa)
- match (stringa, regex)
- split (string, array, separator)
- split (stringa, array)
- sprintf (formato, ...)
- sub (regex, subst, string)
- sub (regex, subst)
- gsub (regex, subst)
- gsub (regex, subst, string)
- substr (stringa, inizio, fine)
- substr (stringa, inizio)
- tolower (stringa)
- toupper (stringa)
Parametri
| Parametro | Dettagli |
|---|---|
| grande | La stringa che viene scansionata per "piccolo". |
| fine | L'indice in cui terminare la sottostringa. |
| formato | Una stringa di formato printf . |
| poco | La stringa da cercare in "big". |
| regex | Un'espressione estesa-regolare . |
| inizio | L'indice in cui iniziare la sottostringa. |
| stringa | Una stringa. |
| subst | La stringa da sostituire per la parte corrispondente. |
Conversione di stringa in lettere maiuscole
La funzione toupper convertirà una stringa in lettere maiuscole (lettere maiuscole). Per esempio:
BEGIN {
greeting = "hello"
loud_greeting = toupper(greeting)
print loud_greeting
}
Questo codice genererà "HELLO" quando è in esecuzione.
Concatenazione di stringhe
La concatenazione delle stringhe viene eseguita semplicemente scrivendo espressioni l'una accanto all'altra senza alcun operatore. Per esempio:
BEGIN {
user = "root"
print "Hello "user "!"
}
stamperà: Hello root!
Nota che le espressioni non devono essere separate da spazi bianchi.
Calcolare un hash di una stringa
L'implementazione di uno degli algoritmi di hashing standard in awk è probabilmente un compito noioso, la definizione di una funzione di hash che può essere utilizzata come handle per i documenti di testo è molto più trattabile. Una situazione pratica in cui tale funzione è utile consiste nell'assegnare id brevi a elementi forniti della loro descrizione, ad esempio casi di test, in modo che l'id breve possa essere fornito come riferimento all'elemento dall'utente anziché fornire la sua descrizione lunga.
La funzione di hash deve convertire i caratteri in codici numerici, il che si ottiene utilizzando una tabella di ricerca inizializzata all'inizio dello script. La funzione di hash viene quindi calcolata utilizzando trasformazioni aritmetiche modulari, un approccio molto classico al calcolo degli hash.
A scopo dimostrativo, aggiungiamo una regola per decorare le linee di input con il loro hash, ma questa regola non è necessaria per utilizzare la funzione:
BEGIN{
for(n=0;n<256;n++) {
ord[sprintf("%c",n)] = n
}
}
function hash(text, _prime, _modulo, _ax, _chars, _i)
{
_prime = 104729;
_modulo = 1048576;
_ax = 0;
split(text, _chars, "");
for (_i=1; _i <= length(text); _i++) {
_ax = (_ax * _prime + ord[_chars[_i]]) % _modulo;
};
return sprintf("%05x", _ax)
}
# Rule to demonstrate the function
# These comments and the following line are not relevant
# to the definition of the hash function but illustrate
# its use.
{ printf("%s|%s\n", hash($0), $0) }
Salviamo il programma sopra nel file hash.awk e lo dimostriamo in una breve lista di titoli classici di libri inglesi:
awk -f hash.awk <<EOF
Wuthering Heights
Jane Eyre
Pride and Prejudice
The Mayor of Casterbridge
The Great Gatsby
David Copperfield
Great Expectations
The Return of the Soldier
Alice's Adventures in Wonderland
Animal Farm
EOF
L'output è
6d6b1|Wuthering Heights
7539b|Jane Eyre
d8fba|Pride and Prejudice
fae95|The Mayor of Casterbridge
17fae|The Great Gatsby
c0005|David Copperfield
7492a|Great Expectations
12871|The Return of the Soldier
c3ab6|Alice's Adventures in Wonderland
46dc0|Animal Farm
Quando viene applicato su ciascuna delle 6948 righe non vuote del mio romanzo preferito, questa funzione di hash non genera alcuna collisione.
Converti stringa in minuscolo
AWK spesso usato per manipolare interi file contenenti un elenco di stringhe. Diciamo che il file awk_test_file.txt contiene:
First String
Second String
Third String
Per convertire tutte le stringhe in minuscolo eseguire:
awk '{ print tolower($0) }' awk_test_file.txt
Ciò comporterà:
first string
second string
third string
Sostituzione del testo stringa
La funzione SUB consente di sostituire il testo all'interno di awk
sub (regexp, replacement, target)
dove regexp potrebbe essere un'espressione regolare completa
$ cat file
AAAAA
BBBB
CCCC
DDDD
EEEE
FFFF
GGGG
$ awk '{sub("AAA","XXX", $0); print}' file
XXXAA
BBBB
CCCC
DDDD
EEEE
FFFF
GGGG
Estrazione della sottostringa
GNU awk supporta una funzione di estrazione sotto stringa per restituire una sequenza di caratteri a lunghezza fissa da una stringa principale. La sintassi è
*substr(string, start [, length ])*
dove, string è stringa di origine e start segna l'inizio della posizione sub-stringa che si desidera l'estrazione da fare per un periodo opzionale length caratteri. Se la lunghezza non è specificata, l'estrazione viene eseguita fino alla fine della stringa.
Il primo carattere della stringa viene considerato come numero uno del carattere.
awk '
BEGIN {
testString = "MyTESTstring"
substring = substr(testString, 3, 4) # Start at character 3 for a length of 4 characters
print substring
}'
emetterà la stringa secondaria TEST .
awk '
BEGIN {
testString = "MyTESTstring"
substring = substr(testString, 3) # Start at character 3 till end of the string
print substring
}'
questo estrae la sottostringa dalla posizione del carattere 3 alla fine dell'intera stringa, restituendo la stringa TESTstring
Nota:-
- Se
startviene assegnato un valore negativo,GNUawk stampa l'intera stringa e se allalengthviene assegnato un valore diverso da zero,GNUawk restituisce una stringanulle il comportamento varia tra le diverse implementazioni diawk.