Определение строк, заканчивающихся заглавными буквами, с использованием AWK и использование их в качестве разделителей записей - PullRequest
0 голосов
/ 19 февраля 2020

Это уменьшенная репрезентативная версия файла данных, которую мне нужно проанализировать и разделить на фрагменты с помощью awk на основе римской цифры каждого фрагмента.

I                                                                                                                                                                                                    
   Apple                                                                                                                                                                                             
   II                                                                                                                                                                                                
Banana                                                                                                                                                                                               

   III                                                                                                                                                                                               
   Mango                                                                                                                                                                                             
IV                                                                                                                                                                                                   
Durian                                                                                                                                                                                               
Lemon                                                                                                                                                                                                

   IV                                                                                                                                                                                                
      Papaya                                                                                                                                                                                         
       V              

Это казалось простой задачей с awk, поэтому я попытался gawk -v RS="[A-Z]+$" '{print $0}' blah.txt использовать строки, заканчивающиеся одной или несколькими заглавными буквами (таким образом указывая строки с римскими цифрами), в качестве разделителей записей.

Удивительно, но программа выдала весь файл данных. Где я go ошибся? Еще более удивительно, если я помещу exit после оператора print, он все еще печатает весь файл (указывая, что весь файл рассматривается как одна запись)

Я использую GNU AWK 4.1.3 на машине Linux Mint.

ПРИМЕЧАНИЕ: Конкретный c вариант использования, который я имею в виду, состоит в том, чтобы извлечь произвольный шекспировский номер, так что nnet по номеру, из текстового файла в http://www.gutenberg.org/cache/epub/1041/pg1041.txt (после удаления данных верхнего и нижнего колонтитулов)

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Учитывая ввод на http://www.gutenberg.org/cache/epub/1041/pg1041.txt, похоже, что вы можете просто напечатать 12-й, 14-й, 16-й абзац, чтобы получить желаемый результат. Для этого достаточно установить в качестве разделителя записей пустую строку и напечатать нужную запись.

Например, чтобы напечатать первый, nnet:

$ awk -v RS='' -v sonnet=1 'NR == 10 + 2 * sonnet' file
  From fairest creatures we desire increase,
  That thereby beauty's rose might never die,
  But as the riper should by time decease,
  His tender heir might bear his memory:
  But thou, contracted to thine own bright eyes,
  Feed'st thy light's flame with self-substantial fuel,
  Making a famine where abundance lies,
  Thy self thy foe, to thy sweet self too cruel:
  Thou that art now the world's fresh ornament,
  And only herald to the gaudy spring,
  Within thine own bud buriest thy content,
  And tender churl mak'st waste in niggarding:
    Pity the world, or else this glutton be,
    To eat the world's due, by the grave and thee.
2 голосов
/ 19 февраля 2020

Виновным является $ - GNU awk рассматривает весь файл как одну строку с целью сопоставления регулярному выражению RS, и, таким образом, $ соответствует только в конце файла (это отмечено в руководстве ). Попробуйте заменить его на \>, что соответствует концу слова, а не концу строки (и \<, чтобы соответствовать началу слова, чтобы сопоставлялись только такие вещи, как I и IV):

$ awk -v RS='\\<[A-Z]+\\>' '{print $0}' input.txt 


   Apple                                                                                                                                                                                             


Banana                                                                                                                                                                                               



   Mango                                                                                                                                                                                             


Durian                                                                                                                                                                                               
Lemon                                                                                                                                                                                                



      Papaya                                                                                                                                                                                         

Разумеется, вам придется иметь дело со всеми дополнительными символами новой строки и пробелами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...