Мы также можем сделать это ниже команды awk
echo "123-45-6789-10101"| awk '{gsub("[^0-9]","",$1);print }'
Выход
12345678910101
Я думаю, что проблема, с которой вы столкнулись, связана со следующим утверждением на (странице руководства 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».
Нашел пример здесь и немного модифицировал его:
Другой способ — заменить его другим символом-разделителем и использовать вместо него:
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
— конечный столбец.