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

объединение 2 файлов при сопоставлении значений столбца с использованием awk

Я знаю, что были опубликованы похожие вопросы, но у меня все еще возникают проблемы с получением вывода, который я хочу, используя awk FNR == NR... У меня есть 2 файла как таковых

File 1: 
123|this|is|good
456|this|is|better
...

File 2:
aaa|123
bbb|456
...

Итак, я хочу объединить значения из файла 2/column2 в файл 1/column1 и вывести файл 1 (столбец 2,3,4) и файл 2 (столбец 1).

Заранее спасибо.

12.02.2015

Ответы:


1

С awk вы можете сделать что-то вроде

awk -F \| 'BEGIN { OFS = FS } NR == FNR { val[$2] = $1; next } $1 in val { $(NF + 1) = val[$1]; print }' file2 file1

NF — это количество полей в записи (по умолчанию строка), поэтому $NF — это последнее поле, а $(NF + 1) — поле после него. Присвоив ему сохраненное значение из прохода через file2, новое поле добавляется к записи перед ее печатью.

Следует отметить одну вещь: это ведет себя как внутреннее соединение, т. е. печатаются только те записи, ключ которых присутствует в обоих файлах. Чтобы сделать это правильным соединением, вы можете использовать

awk -F \| 'BEGIN { OFS = FS } NR == FNR { val[$2] = $1; next } { $(NF + 1) = val[$1]; print }' file2 file1

То есть вы можете отказаться от условия $1 in val в действии добавления и печати. Если $1 не находится в val, val[$1] пусто, и перед печатью к записи будет добавлено пустое поле.

Но, вероятно, лучше использовать join:

join -1 1 -2 2 -t \| file1 file2

Если вы не хотите, чтобы ключевое поле было частью вывода, направьте вывод любой из этих команд через cut -d \| -f 2-, чтобы избавиться от него, т.е.

join -1 1 -2 2 -t \| file1 file2 | cut -d \| -f 2-
12.02.2015
  • Вы можете не резать трубы, добавьте опцию соединения: -o 1.2,1.3,1.4,2.2 12.02.2015
  • Мне нравится, как ты используешь $(NF+1). Вы можете сделать его более неудобным, переместив выражение if за скобки: $1 in val { $(NF + 1) = val[$1]; print } 12.02.2015
  • @glennjackman О, это хороший момент. Однако я буду придерживаться cut, чтобы сбрить ключевое поле из вывода; вариант -o может решить проблему, как указано, и имеет свои преимущества, но я чувствую, что преимущество подхода cut в том, что он работает с произвольным количеством столбцов, перевешивает их здесь. Однако, если бы производительность была заявлена ​​как проблема, все могло бы быть иначе. 12.02.2015
  • спасибо! Я не могу использовать объединение (на этом этапе), так как 2 файла не отсортированы. Мне интересно узнать о $(NF +1), так как я новичок в awk - можете немного просветить? 12.02.2015
  • Кстати, предостережение: таким образом печатаются только строки, которые имеют значение в file2 (по сути, это ведет себя как внутреннее соединение). Если вы хотите, чтобы строки, не имеющие значения в file2, печатались с пустым полем, используйте { $(NF + 1) = val[$1] } без условия $1 in val. 12.02.2015

  • 2

    Если файлы имеют одинаковое количество строк в одном и том же порядке, то

    paste -d '|' file1 file2 | cut -d '|' -f 2-5
    
    this|is|good|aaa
    this|is|better|bbb
    

    Я вижу в комментарии к ответу Wintermute, что файлы не отсортированы. В bash подстановки процессов удобны для сортировки на лету:

    paste -d '|' <(sort -t '|' -k 1,1 file1) <(sort -t '|' -k 2,2 file2) |
    cut -d '|' -f 2-5
    

    Повторюсь: это решение требует однозначного соответствия между файлами

    12.02.2015
    Новые материалы

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..