Хобрук: Ваш путь к мастерству в программировании

Как печатать строки с несколькими ассоциативными массивами и условиями с помощью awk

Я хочу напечатать все строки из файла 1, где значения $1 и $4 находятся в $1 и $4 файла 2 И где значение в файле 1 $2 больше или равно значению в файле 2 $2 И где значение в файл 1 $3 меньше или равен значению в файле 2 $3.

файл 1

1   110201809   117658766   a
1   168095261   182305990   b
1   215456074   233436403   c
2   9465687     12905490    d
2   28765309    35235120    e
2   48958595    64702082    f

файл 2

 1  245371026   249210707   a
 2  937388      46504962    h
 2  937388      162731186   b
 2  2954974     6777829     c
 2  9465687     12996275    d
 2  14539477    44757554    d
 2  14766820    30080818    m
 2  16531332    23584565    n
 2  17340076    26206255    o
 2  18535880    24452180    p
 2  28830071    35289330    q
 2  36206662    47273732    r
 2  48958495    64703082    f

Желаемый вывод печатает только те строки из файла 1, которые соответствуют условию.

желаемый результат

 2  9465687     12905490    d
 2  48958595    64702082    f

Я пробовал следующее, что дало пустой файл:

awk 'NR==FNR{ a[$1,$4]= $0; b[$2] = $2 ; c[$3] = $3; next }  ($1 $4 in a) && ($2 >= b[$2]) && ($3 <= c[$3])' file2 file1>desired output

Ответы:


1

Я бы сделал это, собрав второй и третий столбцы в отдельные хеши, например:

parse.awk

NR==FNR { 
  g[$1,$4] = $2
  h[$1,$4] = $3
  next
} 

($1 SUBSEP $4 in g) && g[$1,$4] >= $2 && h[$1,$4] <= $3

Запустите это так:

awk -f parse.awk file1 file2

Выход:

2  9465687     12996275    d
2  48958495    64703082    f
07.04.2018
  • Чтобы соответствовать моему первоначальному вопросу, я предоставил однострочник, используя решение Thor: awk 'NR==FNR { a[$1,$4] = $2; б[$1,$4] = $3; следующий} a[$1,$4] ›= $2 && b[$1,$4] ‹= $3' файл2 файл1›желаемый вывод 07.04.2018
  • @ user3146560: Вы также должны включить проверку существования. Смотрите мое редактирование 07.04.2018
  • Тор, кажется, я понимаю, что вы имеете в виду под своим редактированием ($1 SUBSEP $4 в g), но можете ли вы прокомментировать (или разъяснить), что делает каждый элемент команды? 08.04.2018
  • @user3146560: user3146560: $1 SUBSEP $4 представляет собой конкатенацию этих 3 элементов, которые совпадают с ключами, используемыми в хэш-адресации, например. g[$1,$4]. in g проверяет, находится ли этот конкретный ключ в хэше g. 09.04.2018
  • Новые материалы

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

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

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

    GraalVM в 2022 году: итоги года
    2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..