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

Как мой MacBook пинговать Google, но не мой роутер?
gnome-terminal: как сохранить символические ссылки рабочего каталога при открытии новой вкладки?
Как удалить все файлы, начинающиеся с определенной строки в Linux
wget без сохранения кэша
Как соединить файлы в командной строке без создания временных файлов?
Преобразование всех файлов в каталоге с помощью FFMPEG
Переименование файлов с помощью текстового файла [закрыт]
Запуск сценария bash из docky
Отправить JSON с помощью curl из сценария bash, если путь JSON указан как переменная
bash как удалить ошибку "BP precmd invoke cmd"?
Использование wget для рекурсивного обхода сайта и загрузки изображений
Как создать действительный случайный MAC-адрес с помощью bash shell
Я добавил новый путь в список путей, но не смог выполнить программу из любого места linux
Двигаться слово в bash
Как я могу получить путь монтирования USB-устройства на OSX?

Добавление пользовательских строк в файл с помощью shell-скрипт

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

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

не имеет значения, куда добавляются строки, так что ничего страшного, если все добавленные строки находятся в конец файла.

5
задан Ben N
источник

1 ответов

awk:

#!/usr/bin/awk -f
BEGIN { OFS = "\t" }
{
    print
    print  - 1, ,  / 2
    print  + 1, ,  / 2
    print ,  - 1,  / 2
    print ,  + 1,  / 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(, , )
    printnew( - 1, ,  / 2)
    printnew( + 1, ,  / 2)
    printnew(,  - 1,  / 2)
    printnew(,  + 1,  / 2)
}
3
отвечен peth 2011-05-16 18:47:42
источник

Другие вопросы bash linux shell-script