Intereting Posts
Создайте ссылку, но не измените канонический путь Testprintenv: ошибка при загрузке разделяемых библиотек: libodbc.so.1: невозможно открыть файл общих объектов Самый быстрый способ определить, содержат ли два отсортированных списка уникальные элементы pthread в реальном времени, созданный из потока, отличного от реального времени, с помощью init.d Не удалось распознать картридж RDX Есть ли способ узнать, кто может получить доступ к папке / папке? Как получить «нулевое время простоя» на HAProxy с конфигурацией балансировки нагрузки? Как планировать выполнение задачи каждый день, если я не знаю, когда компьютер будет включен? Загрузочный журнал для Arch Linux Я использую `history -c` очистить историю, почему первый идентификатор команды не начинается с` 1`? Как настроить SMTP с помощью postfix с пользователем и пройти Как получить загрузку процессора по ядру в процентах? Что такое sourcing мой сценарий оболочки? Перекомпилируйте ядро ​​без модулей, которые в настоящее время не используются Запуск программы в режиме readonly

Найти совпадения из индексного файла без точного соответствия и распечатать последнее поле

У меня большой файл (~ 6mill rows) с 2 столбцами, который выглядит так:

1111.aaaaabbb.b.cccc.c ValueA 2222.dddddeee.e.ffff.f ValueB 3333.gggghhhh.h.iiii.i ValueC 

Я хочу использовать это как мой индекс при поиске в этом файле с одним столбцом:

 aaaaabbb.b dddddeee.e gggghhhh.h 

И вернуться:

 ValueA ValueB ValueC [...] Valuen а ValueA ValueB ValueC [...] Valuen 

Как вы можете видеть, я просто забочусь о значении после первого периода, если есть точное совпадение содержимого второго файла с первым файлом (не точный), я хочу, чтобы он возвращал значение столбца 2 с первого файл. Я не забочусь о префиксе / суффиксе содержимого первого файла, пока точное совпадение содержимого файла 2.

Есть ли способ сделать это с помощью awk или любого инструмента bash ? В настоящее время я пытаюсь правильно отформатировать данные в Excel (data to column tool), но это занимает много времени, так как у меня более 6 миллионов строк, поэтому мне приходится вручную делать 6 файлов, а затем скомпилировать результаты вместе.

Изменить содержимое file1 : префикс всегда числен, но имеет длину от 4 до 7 цифр. Содержимое после первого периода является буквенно-цифровым и варьируется в пределах от 4 до 15 символов и может начинаться с цифр или букв, а суффикс – номера / алфавиты.

Я предполагаю, что файл с индексом не слишком велик, чтобы его можно было полностью загрузить в память. Если да, вы можете использовать этот awk :

 awk -F"[. ]" 'FNR==NR{a[$0]=1} FNR!=NR&&a[$2"."$3]{print $NF}' index_file huge_file 

  • awk вызывается с двумя файлами: index_file с содержимым для поиска и huge_file со многими строками, как в вопросе.
  • -F"[. ]" Устанавливает разделитель awks в пространство и точку.
  • FNR==NR применяется только к index_file
    • a[$0]=1 заполнить массив a шаблонами поиска как индексы и установить значение 1 , только чтобы массив был построен.
  • FNR!=NR применяется только к huge_file .
  • a[$2"."$3] если существует индекс массива поля 2 и поле 3, конкатенированные точкой (когда шаблон найден) …
    • print $NF напечатать последнее поле файла.

Выход:

 ValueA ValueB ValueC а ValueA ValueB ValueC