awk
Функции манипуляции строками
Поиск…
Синтаксис
- индекс (большой, маленький)
- длина или длина ()
- Длина (строка)
- match (string, regex)
- split (строка, массив, разделитель)
- split (строка, массив)
- sprintf (формат, ...)
- sub (regex, subst, string)
- sub (regex, subst)
- gsub (regex, subst)
- gsub (regex, subst, string)
- substr (строка, начало, конец)
- substr (строка, начало)
- ToLower (строка)
- ToUpper (строка)
параметры
| параметр | подробности |
|---|---|
| большой | Строка, отсканированная для «маленького». |
| конец | Индекс, по которому заканчивается подстрока. |
| формат | Строка формата printf . |
| немного | Строка для сканирования в «большом». |
| регулярное выражение | Расширенное регулярное выражение . |
| Начните | Индекс, с которого начинается подстрока. |
| строка | Строка. |
| Подст | Строка для замены для согласованной части. |
Преобразование строки в верхний регистр
Функция toupper преобразует строку в верхний регистр (заглавные буквы). Например:
BEGIN {
greeting = "hello"
loud_greeting = toupper(greeting)
print loud_greeting
}
Этот код выдает «HELLO» при запуске.
Конкатенация строк
Конкатенация строк выполняется просто путем написания выражений рядом друг с другом без какого-либо оператора. Например:
BEGIN {
user = "root"
print "Hello "user "!"
}
будет печатать: Hello root!
Обратите внимание, что выражения не должны разделяться пробелами.
Вычисление хеша строки
Хотя реализация одного из стандартных алгоритмов хэширования в awk , вероятно, является утомительной задачей, определение хеш- функции, которая может использоваться как дескриптор текстовых документов, гораздо более сговорчива. Практическая ситуация, когда такая функция полезна, заключается в том, чтобы назначить короткие идентификаторы элементам, указанным в их описании, например, тестовые примеры, так что короткий идентификатор может быть указан как ссылка на элемент пользователем, а не на его длинное описание.
Хэш- функции необходимо преобразовать символы в числовые коды, которые выполняются с помощью таблицы поиска, инициализированной в начале скрипта. Затем хэш- функция вычисляется с использованием модулярных арифметических преобразований, очень классического подхода к вычислению хешей.
Для демонстрационных целей мы добавляем правило, чтобы украшать строки ввода хешем, но это правило не требуется для использования функции:
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) }
Мы сохраняем программу выше в файл hash.awk и демонстрируем ее в кратком списке классических английских книг:
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
Выход
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
При применении к каждой из 6948 непустых строк моего любимого романа эта хэш-функция не вызывает никакого столкновения.
Преобразование строки в нижний регистр
AWK часто используется для управления целыми файлами, содержащими список строк. Скажем, файл awk_test_file.txt содержит:
First String
Second String
Third String
Чтобы преобразовать все строки в нижний регистр:
awk '{ print tolower($0) }' awk_test_file.txt
Это приведет к:
first string
second string
third string
Подстановка текста строки
Функция SUB позволяет заменить текст внутри awk
sub (регулярное выражение, замена, цель)
где regexp может быть полным регулярным выражением
$ cat file
AAAAA
BBBB
CCCC
DDDD
EEEE
FFFF
GGGG
$ awk '{sub("AAA","XXX", $0); print}' file
XXXAA
BBBB
CCCC
DDDD
EEEE
FFFF
GGGG
Выделение подстроки
GNU awk поддерживает функцию извлечения подстроки для возврата последовательности символов фиксированной длины из основной строки. Синтаксис
*substr(string, start [, length ])*
где, string - это string источника и start отметка начала позиции подстроки, которую вы хотите, чтобы извлечение выполнялось для необязательных символов длины length . Если длина не указана, извлечение выполняется до конца строки.
Первый символ строки рассматривается как символ номер один.
awk '
BEGIN {
testString = "MyTESTstring"
substring = substr(testString, 3, 4) # Start at character 3 for a length of 4 characters
print substring
}'
выведет подстроку TEST .
awk '
BEGIN {
testString = "MyTESTstring"
substring = substr(testString, 3) # Start at character 3 till end of the string
print substring
}'
это извлекает подстроку из позиции символа 3 в конец всей строки, возвращая TESTstring
Заметка:-
- Если для
startзадано отрицательное значение,GNUawk печатает всю строку, а еслиlengthзадана ненулевым значением, то поведениеGNUawk возвращаетnullстроку, и поведение варьируется в разных реализацияхawk.