Использование 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