Использование Awk для удаления пробелов

У меня есть файл в виде:

Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title
...

Я пытаюсь использовать awk для разбора файла в форму, читаемую makedbm (для создания пользовательской карты NIS). Разделитель полей - это точка с запятой. Мне нужно иметь возможность удалить все начальные пробелы из каждого поля в каждой строке, но оставить пробелы в поле имени и поле заголовка. Благодарю.

5 ответов

Если вы хотите удалить leading space from all fields и держать space in between the Names and Job title fields тогда вы можете сделать что-то вроде этого -

awk -F";" -v OFS=";" '{for (i=1;i<=NF;i++) gsub (/^ */,"",$i);print}' INPUT_FILE

Тестовое задание:

[jaypal:~/Temp] cat file
Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title

[jaypal:~/Temp] awk -F";" -v OFS=";" '{for (i=1;i<=NF;i++) gsub (/^ */,"",$i);print}' file
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title

Это можно сделать гораздо проще с sed:

sed 's/^ *//; s/; */;/g'

Это предполагает, что весь ваш пробел является просто пробелами. Чтобы включить все пробельные символы, посмотрите на классы символов POSIX, а именно:

sed 's/^[[:space:]]*//; s/;[[:space:]]*/;/g'

Демо (на OSX):

% echo 'Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title' | sed 's/^[[:space:]]*//; s/;[[:space:]]*/;/g'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title

Если ваша версия sed не поддерживает разделение операторов точкой с запятой, вы можете использовать отдельные команды, используя -e:

% echo 'Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title' | sed -e 's/^[[:space:]]*//' -e 's/;[[:space:]]*/;/g'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title

Многие способы могут достичь вашей цели.

просто добавьте еще один для удовольствия:

awk -v OFS=";" -F'; *' '{gsub(/^ */,"")}$1=$1' file

еще короче

awk -v OFS=";" -F'; *' 'gsub(/^ */,"", $1)' file

тестовое задание

kent$  echo "Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title
"|awk -v OFS=";" -F'; *' '{gsub(/^ */,"")}$1=$1'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title


kent$  echo "Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title
"|awk -v OFS=";" -F'; *' 'gsub(/^ */,"",$1)'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title

Просто выполните gsub для вашего номера поля, например:

gsub (/^ */, "", $1);

Это заменит все ведущие пробелы ничем, при этом все остальные пробелы останутся нетронутыми. gsub Функция выполняет глобальную замену заданного шаблона новым значением указанной переменной.

В этом случае шаблон ^ *означает начало строки, за которым следует ноль или более пробелов. Шаблон замены - это пустая строка, а используемая переменная - это первое поле в строке, $1,

Следующая расшифровка показывает это в действии для всех столбцов в строке, управляемых i переменная. NF количество полей в текущей строке и $i относится к полю в положении i,

$ cat file | awk -F\; -vOFS=\; '{
    for (i = 1; i <= NF; i++) {
        gsub (/^ */, "", $i);
    };
    print}'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title

Попробуй это

{
    gsub(";  *",";")
    gsub("^  *","")
    print
}
Другие вопросы по тегам