2

У меня есть текстовый файл с произвольным количеством строк, триплеты, подобные этим:

4   5   2
12  16  6

Теперь я хочу добавить связанные строки в файл. Допустим, я хочу добавить 4 дополнительные строки в строку, которые имеют аналогичные значения. Первые два столбца слегка изменены (-1 и +1 для ровно одного из них, для всех четырех комбинаций), а для третьего столбца значение уменьшается вдвое:

4   5   2   (original row)
3   5   1   (added rows)
5   5   1
4   4   1
4   6   1
12  16  6   (original row)
11  16  3   (added rows)
13  16  3
12  15  3
12  17  3

Неважно, куда добавляются строки, поэтому все в порядке, если все добавленные строки находятся в конце файла.

1 ответ1

3

awk:

#!/usr/bin/awk -f
BEGIN { OFS = "\t" }
{
    print
    print $1 - 1, $2, $3 / 2
    print $1 + 1, $2, $3 / 2
    print $1, $2 - 1, $3 / 2
    print $1, $2 + 1, $3 / 2
}

Конечно, это немного зависит от того, как вам нужно отформатировать вывод. В приведенном выше примере предполагается, что входные записи разделены табуляцией.


Чтобы удалить дубликаты после этого, направьте вывод через sort -n | uniq

Вариант, который не печатает их в первую очередь (и сохраняет первоначальный порядок), может хранить видимые значения в массиве и печатать только новые:

#!/usr/bin/awk -f
function printnew(a, b, c) {
    if(seen[a, b, c] != 1) {
        seen[a, b, c] = 1
        print a, b, c
    }
}

BEGIN { OFS = "\t" }

{
    printnew($1, $2, $3)
    printnew($1 - 1, $2, $3 / 2)
    printnew($1 + 1, $2, $3 / 2)
    printnew($1, $2 - 1, $3 / 2)
    printnew($1, $2 + 1, $3 / 2)
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .