Вам нужно сопоставить поле и -отформатировать его; вот awk-скрипт, который ищет три варианта и повторно -форматирует их (до значения по умолчанию -печатает восстановленную строку):
$3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 1, 3) ") " substr($3, 4, 3) "-" substr($3, 7, 4)
}
$3 ~ /^[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 1, 3) ") " substr($3, 5, 3) "-" substr($3, 9, 4)
}
$3 ~ /^\+1 \([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 5, 3) ") " substr($3, 10, 3) "-" substr($3, 14, 4)
}
1
Сохраните это в файл, например phone.awk
, затем вызовите его с помощью:awk -F $'\t' -f phone.awk < input
.
Я не понимаю, как вы могли получить этот вывод при запускеa
:вы опубликовали вывод из другой версии? Но в любом случае я вижу, что не так с кодом.
Первая проблема заключается в том, что local $1=…
не делает того, что вы думаете. Он устанавливает переменную, имя которой является первым параметром, но не устанавливает первый параметр. Например, если вы вызываете функцию как a foo
, первая строка устанавливает для локальной переменной foo
значение foo
. Если вы вызовете a
без аргументов, вы получите
bash: local: `=3600': not a valid identifier
(и другие ошибки ), потому что то, что слева от =
, является пустой строкой, а пустая строка не является допустимым именем для переменной.
Вы не можете использовать синтаксис присваивания для установки пронумерованных параметров.:local 1=…
также не работает. Вам нужно либо дать переменной имя, либо использовать встроенную функцию set
, чтобы установить сразу все пронумерованные параметры.
a () {
local delay="${1:-3600}"
local first_command_to_split_and_glob="${2:-paa}"
local second_command_to_split_and_glob="${3:-alarm}"
sleep "$delay" && $first_command_to_split_and_glob && $second_command_to_split_and_glob
}
Вторая проблема заключается в том, что псевдонимы раскрываются только тогда, когда они явно появляются в начале команды. Они не расширяются из результата какого-либо другого расширения, такого как получение значения переменной.
В вызове $first_command_to_split_and_glob
есть еще одна проблема, заключающаяся в том, что он работает только в простых случаях. Он разбивает значение переменной (, т. е. аргумент, переданный функции )в пробеле, затем интерпретирует каждую часть как шаблон подстановки, который расширяется, если шаблон соответствует хотя бы одному имени файла. Например, a 2 'cat "file name with spaces"'
пытается отобразить содержимое файлов с именами "file
, name
, with
и spaces"
. Расширение переменной вне кавычек применяет операцию «split+glob» :, она не возвращает значение переменной и не выполняет вычисление значения, а выполняет нечто промежуточное, что редко бывает полезно. См. Почему мой сценарий оболочки забивается пробелами или другими специальными символами? для более подробной информации.
Чтобы устранить эти две проблемы, используйте eval
в строке.Обратите внимание на двойные кавычки вокруг "$first_command"
и "$second_command"
, чтобы избежать разделения и подстановки.
a () {
local delay="${1:-3600}"
local first_command="${2:-paa}"
local second_command="${3:-alarm}"
sleep "$delay" && eval "$first_command" && eval "$second_command"
}
Наконец, чтобы передать пустой аргумент, используйте кавычки для разделения пустой строки. Например:
a '' pah
ждет 3600 секунд, затем запускается pah
, а затем запускается alarm
.