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

Я прочитал кучу текстовых файлов, чтобы извлечь некоторые шаблоны. Мне также нужен номер строки, но номер строки должен быть удален до окончательного 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
  • Как разбить файл на основе списка шаблонов и назвать выходные файлы по шаблону?
  • Поиск дубликатов экземпляров тега в файле
  • Каковы точные различия между awk и cut с помощью grep?
  • Проблема с grep, egrep в solaris
  • Могу ли я запустить grep из cPanel без SSH?
  • Поиск файлов для строки и если найден, проверьте, существует ли файл с парным именем в том же каталоге
  • Как определить, присутствует ли строка в stdout, не влияя на вывод?
  • Как я могу grep определенный текст и отображать его строку и строку после
  • Поиск номера в тексте
  • Захват групп с помощью awk или grep
  • Interesting Posts

    Общие подпрограммы в RPM

    Замена обратной косой черты запятыми в Bash

    Где находится системный профиль, который получается при регистрации в CentOS 5.8?

    Как перенести изображение ОС на устройство на другое устройство?

    Почему mv не может иметь дело с существованием каталога с одним именем в месте назначения?

    браузеры не работают (chrome err 137: сбой разрешения имен), но все в порядке в терминале gnome

    При использовании btrfs, почему значения «Размер», «Использовать» и «Использовать» из df не совпадают?

    Разделение без таблиц HDD

    Замена строки1 на строку 2 в строках, содержащих строку3 – со строкой1, имеющей несколько раз

    Резервное копирование Bacula – Невозможно найти какие-либо дополнительные объемы

    Невозможно использовать команду date для изменения определенного формата даты в оболочке Bash на терминале OS X

    Автоматизация процесса создания виртуального хоста

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

    Программный центр Ubunutu не работает, показывая черный экран

    Невозможно использовать vera ++ на Ubuntu

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