LINUX.ORG.RU
ФорумAdmin

Awk. Форматирование вывода

 ,


0

1

Добрый вечер. Форматирую отчет о звонках командой

cat CDRReport-2017Jan17.115323.csv | awk -F "," '{print $1 "," $2 "," $7 "," $9 "," $9}'

Получаю вывод вида:

«2016-12-01 09:01:20»,«364420»,«Local/501@from-queue-0000030a;1»,«123s (2m 3s)»,«123s (2m 3s)»

Как можно в поле «Local/501@from-queue-0000030a;1»(оно же $7) убрать слева часть текста до «/»(включая «/»), а справа убрать часть текста после «@»(включая «@»). Тоже самое только в последнем поле «123s (2m 3s)», убрать все справа до «s»(включая «s»), так чтобы осталось только число(в данном примере 123).

PS:

substr($7, 8, 3)

не подходит, так как не будет работать для четырехзначных номеров.

Регулярные выражения?

anonymous
()

1.

 grep -oE "\/.*@" | grep -o -E "[0-9]*"  
сначала выгрепали вместе с '/' и '@', потом - циферки между ними
2.
 cut -d 's' -f1 
отрезали всё до первого символа 's'

Crewger
()

Лучше всегда выкладывать исходную задачу.

Те. я б помог, но если бы был пример исходной строчки до awk, и что нужно достать.

anonymous
()
Ответ на: комментарий от bscoder

+1 за substr+index.
для понимания можно вынести их в вычисление отдельными переменными перед print-ом.

bl ★★★
()
# запускать /usr/bin/perl -n скрипт < CDRReport-2017Jan17.115323.csv
@data = (split(/\s*,\s*/))[0, 1, 6, 8];
($data[2]) = ($data[2] =~ /\/([\d\*#]*)\@/); # можно «m!/([\d\*#]*)\@!», но у парсера сайта крышу сносит
($data[3]) = ($data[3] =~ /^(\d+)s/);
print join(", ", @data[0..3, 3])."\n";

не проверял

berrywizard ★★★★★
()
$ echo "Local/501@from-queue-0000030a;1,123s (2m 3s)" | awk -F, '{ split($1, num, /[/@]/); split($2, time, /s/); print num[2] "," time[1] }'
501,123
unterwulf
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.