вывести номер строки и шаблон в файл одновременно

Я прочитал кучу текстовых файлов, чтобы извлечь некоторые шаблоны. Мне также нужен номер строки, но номер строки должен быть удален до окончательного grep (но может быть сохранен для дальнейшей обработки, возможно, с использованием переменных).

Я объясню, как моя процедура разбивает команду (long oneliner) для лучшего понимания:

  1. прочитать файл с кошкой , выполнить некоторую очистку (удалить странные символы и линейные каналы с помощью sed и tr ) и т. д. Вот только пример многих задач по очистке трубопроводов:

    cat file | sed 's/,/ /g' | sed '/^$/d' 
  2. добавить номер строки и вкладку с помощью команды nl и дополнительной обработки и очистки

      nl -nrz -w4 -s$'\t' | tr '\n\r' ' ' 
  3. извлечь окончательный желаемый шаблон в файл CSV

      grep -Eio '.{0,0}account number.{0,15}' >> account_list.csv 

Проблема в том, что мне нужен номер строки с шага 2 до того же самого CSV (другой столбец, независимо от порядка), используя КОМАНДУ SAME ONE LINE (пока не разрешено или не разрешено), но пока нет успеха.

[EDITED для лучшего понимания] Учитывайте номер строки, который мне нужен, является оригинальной до очистки файлов. Этот процесс очистки иногда удаляет некоторые абзацы. Представьте файл с тысячей строк, после обработки я получил сто. Неверная нумерация строк. [end edit]

Пример ввоза после некоторой обработки:

 0123 the first account number 2345356432 must be used 0345 take it just for billing purposes, not any other. 0657 Meanwhile the second account number 8623525534 0987 user is blocked until the issue is solved with 

Желаемая opupput будет:

  2345356432; 0123 8623525534; 0657 

или

 0123; 2345356432 0657; 8623525534 

любой намек был бы очень оценен

4 Solutions collect form web for “вывести номер строки и шаблон в файл одновременно”

Использование awk в исходном файле ввода перед очисткой:

 awk '/account number [[:digit:]]+/ { match($0, "account number ([[:digit:]]+)", a); print NR ";" substr($0, a[1, "start"], a[1, "length"]); }' input 

Это извлекает номер учетной записи и печатает номер строки в начале строки:

 1;2345356432 3;8623525534 

Если вы хотите извлечь предварительно обработанный номер из очищенного файла:

 awk '/account number [[:digit:]]+/ { match($0, "account number ([[:digit:]]+)", a); print $1 ";" substr($0, a[1, "start"], a[1, "length"]); }' input 

Немного разделив это:

  • /account number [[:digit:]]+/ гарантирует, что мы обрабатываем только строки, соответствующие «номеру учетной записи», за которым следует номер;
  • match($0, "account number ([[:digit:]]+)", a) снова ищет шаблон и сохраняет позиции и длины совпадающих групп ( ([[:digit:]]+) , номер ) в массиве a ;
  • print NR ";" substr($0, a[1, "start"], a[1, "length"]) print NR ";" substr($0, a[1, "start"], a[1, "length"]) печатает номер записи ( т. е. номер строки, используйте FNR если вы хотите обработать несколько файлов), за которым следует ; , а затем подстрока, соответствующая первой группе: a[1, "start"] дает свой начальный индекс, a[1, "length"] его длину (это было заполнено match ).

Все это предполагает, что в каждой строке есть не более одного номера счета.

Второй вариант печатает $1 вместо NR , то есть первое поле в файле, которое является предварительно обработанным номером строки.

Если ваша версия grep поддерживает регулярные выражения Perl, вы можете использовать look-behind:

 grep -Pnio "(?<=account number.)([0-9]{0,15})" text 

Учитывая ваш ввод и вывод, awk-скрипт выглядит намного проще:

 gawk '/account number/ { nr=gensub(/.*account\s*number\s*([0-9]+).*/, "\\1", "g") print FNR "; " nr }' 

Конечно, вам может понадобиться адаптировать формат извлечения и вывода номера счета к вашим любимым. Но ты получил идею. (Требуется GNU awk из-за использования функции gensub .)

Я был бы склонен использовать Perl для этого, что-то вроде этого должно работать:

 perl -ne 'print "$1; $2\n" if /^(\d+).*account number (\d+)/' input 

В строках, начинающихся с некоторых цифр ( ^\d+ ) и содержащих строку «номер счета», за которой следуют некоторые цифры, напечатайте 1 и 2 группы захвата (части в скобках, здесь цифры). Если вы хотите напечатать идею Perl о номере строки, используйте $. вместо $1 .

  • Рекурсивно заменить строку в файлах
  • Какое регулярное выражение в grep ищет строки из трех одинаковых букв подряд?
  • Что такое эквивалент python для grep -v?
  • Могу ли я использовать Find и Grep в одной строке
  • grep несколько строк, подсчет строк, эхо-выход для каждой строки
  • Как я могу исключить все «отклоненные разрешения» сообщения из «find» в Solaris
  • Как найти точную строку без ведущего или конечного символа
  • Как сгладить журналы для списка шаблонов и сделать из него отчет?
  • Количество файлов, содержащих заданную строку
  • Получить файлы с именем, содержащим значение даты, меньшее или равное заданной дате ввода
  • Греп с пробелами внезапно не работает
  • Interesting Posts

    Извлечь (и сбросить в stdout) только определенный диапазон строк из CSV?

    Обучение в среде программирования Unix

    Как дать многомерному массиву значение для каждой ячейки,

    не удалось выполнить резервное копирование данных с планшета Android на ноутбук с использованием tar!

    Загрузка полного Linux Mint с USB на Intel Macbook pro?

    Поиск темы для рыбы с помощью powerline, полного пути и возврата и возврата каретки после строки подсказки

    эмулировать сочетание клавиш с xdotool

    Вернуться к спине Трубы в команду

    ahci: nvme remap поддерживает исправления и debian-stable

    Как я могу ввести символы Unicode в терминал Konsole KDE с рабочего стола Gnome?

    Изображения NEF / RAW слишком малы в geeqie

    Как исправить `. имя файла "надежно?

    вставлять переменный текст после другого текста переменной на определенной строке

    Какой инструмент я могу использовать для создания резервных копий?

    Вызовите один скрипт оболочки другим

    Linux и Unix - лучшая ОС в мире.