Разделяйте поля многосимвольным разделителем с помощью awk

Мы также можем сделать это ниже команды awk

echo "123-45-6789-10101"| awk '{gsub("[^0-9]","",$1);print }'

Выход

12345678910101
7
04.05.2020, 09:33
2 ответа

Я думаю, что проблема, с которой вы столкнулись, связана со следующим утверждением на (странице руководства GNU)awk[1]:

If FS is a single character, fields are separated by that character. If FS is the null string, then each individual character becomes a separate field. Otherwise, FS is expected to be a full regular expression.

Так как ваш шаблон разграничения полей содержит символы, которые имеют особое значение в регулярных выражениях (, |и ^), вам необходимо правильно экранировать их. Из-за того, как awkинтерпретирует переменные (, строковые литералы анализируются дважды ), вам нужно будет указать, что с помощью двойной обратной косой черты , как в

awk -F '\\|~\\^' '{print $2}' input.txt

Результат для вашего примера:

20200425
abc
abc
abc
abc
abc
abc
20200425

Чтобы учитывать только строки, начинающиеся с T, используйте

awk -F '\\|~\\^' '/^T/ {print $2}' input.txt

или, альтернативно, выбирая только строки, где определенное поле (здесь, первое поле )имеет значениеT:

awk -F '\\|~\\^' '$1=="T" {print $2}' input.txt

Результат для вашего примера в обоих случаях

20200425

Обратите внимание, что совместное использование awk, grepи sedредко требуется. Кроме того, все эти инструменты могут напрямую обращаться к файлам, поэтому использование catдля передачи им текста для обработки также не требуется.

[1] :В качестве (несвязанного )примечания :Часть с «нулевой строкой» работает не во всех вариантах Awk. В руководстве GNU Awk указано «Это распространенное расширение, оно не указано в стандарте POSIX».

18
19.03.2021, 02:25

Нашел пример здесь и немного модифицировал его:

Другой способ — заменить его другим символом-разделителем и использовать вместо него:

cat infile |sed "s/|~^/,/g"
H,20200425,abcd,sum
R,abc,2019-03-05,10.00
R,abc,2019-03-05,20.00
R,abc,2019-03-05,30.00
R,abc,2019-03-06,100.00
R,abc,2019-03-06,15.00
R,abc,2019-03-06,10.00
T,20200425,6,185.00

$ cat infile |sed "s/|~^/,/g" | cut -d',' -f2-3
20200425,abcd
abc,2019-03-05
abc,2019-03-05
abc,2019-03-05
abc,2019-03-06
abc,2019-03-06
abc,2019-03-06
20200425,6

2после -f— начальный столбец, 3— конечный столбец.

1
19.03.2021, 02:25

Теги

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