2016-01-10 2 views
2

У меня есть текстовый файл ввода с абзацами в нем, которые разделены тремя пустыми строками. Пример:awk напечатать в верхней части выходного файла

P1 
P1 
empty line here 
empty line here 
empty line here 
P2 
P2 
empty line here 
empty line here 
empty line here 
P3 
P3 
empty line here 
empty line here 
empty line here 

В настоящее время я использую этот код, написанный в файл * .awk, чтобы получить пункты:

BEGIN{ORS=RS="\n\n\n"} 
/some text pattern comes here because I dont want to print every paragraph just some of them but in reversed order/ 

Так что я хотел бы выходной файл выглядеть следующим образом:

P3 
P3 
empty line here 
empty line here 
empty line here 
P2 
P2 
empty line here 
empty line here 
empty line here 
P1 
P1 
empty line here 
empty line here 
empty line here 

Так что мне было интересно, могу ли я напечатать каждый абзац в верхней части выходного файла, чтобы получить обратный порядок. Можно ли это сделать?

+1

Почему бы вам не написать «пустую строку здесь» вместо того, чтобы просто иметь пустую строку ??? Теперь нам нужно удалить этот текст, чтобы создать образец ввода и ожидаемый результат, если мы хотим проверить потенциальное решение. Обратите внимание, что только gawk поддерживает многозначные значения RS, POSIX awks свободно игнорируют все, кроме первого символа. Вы МОЖЕТЕ посмотреть в 'RS =" "'.Если вы исправите ваш образец ввода и ожидаемый результат, который будет тестироваться как есть, другие могут взглянуть на него. –

ответ

2

Если вы установили RS="", тогда awk будет разделять multi-line records, разделенные пустыми линиями.

Дано:

$ cat /tmp/so.txt 
P1 
P1 



P2 
P2 



P3 
P3 

Вы можете захватить $0, который каждая запись, а затем обратный, что записи:

$ awk 'BEGIN{RS=""} {a[i++]=$0} END {while(i--){ print a[i]; print "\n\n\n"}}' /tmp/so.txt 
P3 
P3 




P2 
P2 




P1 
P1 

Если у вас есть фиксированные три заготовок разделительной линии (и у вас есть gawk) , вы также можете просто:

$ awk 'BEGIN{RS="\n\n\n"} {a[i++]=$0} END {while(i--) print a[i]}' /tmp/so.txt 

редактировать основанный на комментарий

Дано:

P1 a 
P1 b 

P2 a filter this block 
P2 b 

P3 a 
P3 b 

Вы можете добавить шаблон для фильтрации нежелательных блоков:

$ awk 'BEGIN{RS=""} /filter/ {next} {a[i++]=$0} END {while(i--){ print a[i]; print "\n"}}' /tmp/so.txt 
P3 a 
P3 b 


P1 a 
P1 b 
+0

Работает очень хорошо и быстро, как шарм. Однако, если я хочу отфильтровать абзацы, я должен запустить свой другой скрипт (в примере) после того, как я его запустил, но это небольшая проблема, поэтому я принял этот ответ, поскольку он подходит для моего нуждается в лучшем. – sasieightynine

+0

Вы можете добавить фильтр к этому сценарию или использовать его в конвейере. Cheers – dawg

+0

Удивительно, большое вам спасибо за вашу помощь. – sasieightynine

0
tac inputfile | tail -n +4 | awk '{print};END{printf("\n\n\n")}' 

Это (ТАС) будет изменить порядок InputFile, удалить пробела в верхней части (хвост), а затем напечатать все, кроме 3 символа перевода строки в конце (так ТАС исчез те).

+0

'tac' только на Linux, следует отметить. – dawg

+0

Для будущих читателей OSX вы можете использовать 'tail -r filename' вместо' tac'. –

+0

Не хватает ли OS X GNU coreutils? –

0

Будет ли это работать для вас?

cat -n inputfile | sort -r | grep -i 'pattern' | awk -F'\t' 'ORS="\n\n\n" {print $2}' 

Объяснение

cat -n inputfile   # number each line in the file 
sort -r     # sort in reverse order 
grep -i 'pattern'   # grep out paragraphs with your text pattern 
awk -F'\t' 'ORS="\n\n\n" {print $2}' 
          # awk out the numbers and print the second column 

Например, если ваш входной_файл является

Pz - The quick brown fox jumped over the lazy dog 
Pz - The quick blue fox jumped over the lazy dog 



Pa - The quick brown fox jumped over the lazy dog 
Pa - The quick blue fox jumped over the lazy deer 



Px - The quick brown fox jumped over the lazy cat 
Px - The quick bronw fox jumped over the lazy dog 

Запуск следующее Grep из абзацев с текстом шаблона "синие"

cat -n inputfile | sort -r | grep -i 'blue' | awk -F'\t' 'ORS="\n\n\n" {print $2}' 

бы дайте

Pa - The quick blue fox jumped over the lazy deer 


Pz - The quick blue fox jumped over the lazy dog 
Смежные вопросы