Ответ @chim лучший, но он написан как комментарий, поэтому я публикую его как официальный ответ...
ack -g '\bbar.*.c$' | ack -x foo
Мне нравится, что вы можете использовать регулярное выражение для пути...
awk '
function dyd(col, n){
split(col, t, ":");
sep=":";
return t[1]/n sep t[2]/n sep t[3]/n sep t[4]/n sep t[5]/n sep t[6]/n;
};
{ $4=dyd($4, 2); $5=dyd($5, 2); }1' infile |column -t
Это не совсем просто, так как (подражая идее @berndbausch об использовании split
), awk не имеет встроенного -способа сглаживания массивов обратно в строки. Нам нужно использовать printf, и следствием этого является то, что awk забывает, как красиво выровнять вывод.
Но это работает:
#! /usr/bin/gawk -f
function print_div2(arr) {
split(arr, a, ":")
printf(" %d", a[1]/2)
delete a[1]
for(i in a) printf(":%d", a[i]/2)
}
{
ORS=""
print $1, $2, $3 " "
print_div2($4)
print " "
print_div2($5)
print " "
ORS="\n"
print $6, $7
}
Комментарий :ORS используется для подавления любой новой строки из print
до тех пор, пока мы не закончим обработку каждой записи. А поля 4 и 5 отдаем функции print_div2, которая разбивает записи на массив и печатает половину каждой записи.
Поместите его в файл и пометьте как исполняемый. Пример использования:
$./process.awk data.txt
1 18 N 56:0:0:0:0:0 63:0:0:0:0:0 19:0:0:0:0:0 20:0:0:0:0:0
1 19 N 0:0:57:0:0:0 0:0:68:0:0:0 0:0:18:0:0:0 0:0:19:0:0:0
1 20 N 0:56:0:0:0:3 0:62:0:0:0:10 0:16:0:0:0:3 0:13:0:0:0:5
Точное выравнивание столбцов можно восстановить с помощьюcolumn
:
$./process.awk data.txt | column -t
1 18 N 56:0:0:0:0:0 63:0:0:0:0:0 19:0:0:0:0:0 20:0:0:0:0:0
1 19 N 0:0:57:0:0:0 0:0:68:0:0:0 0:0:18:0:0:0 0:0:19:0:0:0
1 20 N 0:56:0:0:0:3 0:62:0:0:0:10 0:16:0:0:0:3 0:13:0:0:0:5