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

I                                                                                                                                                                                                    
   Apple                                                                                                                                                                                             
   II                                                                                                                                                                                                
Banana                                                                                                                                                                                               

   III                                                                                                                                                                                               
   Mango                                                                                                                                                                                             
IV                                                                                                                                                                                                   
Durian                                                                                                                                                                                               
Lemon                                                                                                                                                                                                

   IV                                                                                                                                                                                                
      Papaya                                                                                                                                                                                         
       V              

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

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

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

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

awk
0
smilingbuddha 19 Фев 2020 в 11:46

2 ответа

Лучший ответ

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

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


   Apple                                                                                                                                                                                             


Banana                                                                                                                                                                                               



   Mango                                                                                                                                                                                             


Durian                                                                                                                                                                                               
Lemon                                                                                                                                                                                                



      Papaya                                                                                                                                                                                         

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

2
Shawn 19 Фев 2020 в 09:48

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

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

$ 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
Tom Fenech 19 Фев 2020 в 13:30