Использование Awk для удаления пробелов - PullRequest
2 голосов
/ 07 января 2012

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

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

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

Ответы [ 5 ]

5 голосов
/ 07 января 2012

Если вы хотите удалить 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
3 голосов
/ 07 января 2012

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

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

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

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
1 голос
/ 07 января 2012

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

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

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
1 голос
/ 07 января 2012

Просто выполните 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
0 голосов
/ 07 января 2012

Попробуйте это

{
    gsub(";  *",";")
    gsub("^  *","")
    print
}
...