Как делает awk-F работа?

Можно ли объяснить относительно того, как следующая часть кода работает?

l_Basename="hello_world.ksh"

l_THIS_FILE=`echo $l_Basename | awk -F. '{field=1
             while (field < NF) {
                 printf $field
                 if (field < NF - 1) {
                     printf "."}
                 field++} 
             printf "\n"}'`
1
задан 15 November 2014 в 11:18

2 ответа

-F. устанавливает Разделителя полей на .: Учитывая строку a.b.c., awk будет видеть четыре поля: a, b, c, и (пустое поле).

field=1
while (field < NF) 
{
     printf $field
     if (field < NF - 1) 
     {
         printf "."
     }
     field++
}
  • Циклы кода по каждому полю и печати это. Отметьте это field начинается 1, поскольку поле 0 является всей строкой (или запись, чтобы быть точным). Так как проверка < NF, это никогда не достигает последнего поля.
  • До предпоследнего поля это добавляет a ., по-видимому, как разделитель полей для некоторой другой программы для обработки.

Все сказали, что этот код является замысловатым способом реализовать basename, команда часто раньше разделяла расширение от имени файла:

$ basename hello_world.ksh .ksh
hello_world

Даже в awk, более краткий путь состоял бы в том, чтобы постепенно уменьшить количество полей одним: NF--, и набор Выходной Разделитель полей к ., так, чтобы это было автоматически добавлено между полями:

$ echo hello_world.ksh | awk -F. -v OFS=. '{NF--}1'
hello_world
2
ответ дан 10 November 2019 в 18:43

"-F" опция позволяет изменять символ "разделителя полей" Awk. Awk расценивает каждую строку входных данных, как составлено из нескольких "полей", которые являются по существу словами, разделенными пробелами. Пробел (или символ табуляции) является "разделителем полей" по умолчанию. В некоторых случаях входные данные могут быть разделены на другой символ, например, a ": ", и было бы хорошо быть в состоянии сказать Awk использовать различного разделителя полей. Это - то, что"-F" опция делает. Вызвать Awk и определить a ":" как разделитель полей, мы пишем:

awk -F: ...

В этом случае, разделитель полей является a"."

2
ответ дан 10 November 2019 в 18:43

Другие вопросы по тегам:

Похожие вопросы: