Как разделить несколько значений в столбце на константу?

Ответ @chim лучший, но он написан как комментарий, поэтому я публикую его как официальный ответ...

ack -g '\bbar.*.c$' | ack -x foo

Мне нравится, что вы можете использовать регулярное выражение для пути...

1
10.02.2021, 21:31
2 ответа
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
0
18.03.2021, 22:32

Это не совсем просто, так как (подражая идее @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
0
18.03.2021, 22:32

Теги

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