Додавання користувацьких рядків до файлу за допомогою сценарію оболонки


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

Не має значення, куди додаються рядки, тому добре, якщо всі додані рядки знаходяться в кінці файлу.


І ви справді не можете використовувати для цього щось краще, ніж баш?
Ігнасіо Васкес-Абрамс

Гаразд, я готовий також використовувати Perl, PHP або C ++. Bash був би найелегантнішим і, сподіваємось, з кращим виконанням. Яка ваша пропозиція?
Альп

Відповіді:


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)
}

1
... а для чистоти запускайте результати черезsort -n
Chris Nava

1
Мені подобається це рішення. Чи є простий спосіб видалити дублікати після цього?
Альп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.