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

Я прочитал кучу текстовых файлов, чтобы извлечь некоторые шаблоны. Мне также нужен номер строки, но номер строки должен быть удален до окончательного 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 

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

  • Grep для строки, но игнорировать закомментированные элементы со строкой
  • Соответствующая строка с фиксированным количеством символов с использованием grep
  • Ошибка команды grep
  • Распечатайте несколько строк до и после соответствия шаблону, исключая строки, соответствующие другим шаблонам
  • Как связывать линии между шаблоном начала и конца?
  • Как распечатать перед строк ключевого слова поиска с помощью grep в gz-файле?
  • Добавить что-то в каждый список в файле
  • grep: Как найти консоль для закрытия?
  • 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 .

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