Como exibir o parágrafo final de um documento de texto?

2

digamos que eu tenha três pequenos parágrafos, a contagem de palavras é menor que 100, como mostro apenas o parágrafo final?

    
por Ben Dover 11.10.2016 / 12:06

5 respostas

5

Você pode usar awk paragraph-mode (quando RS está vazio; parágrafos delimitados por sequências de linhas vazias, linhas vazias iniciais e finais ignoradas):

awk -v RS= 'END{print}' < file.txt

Observe que ela imprime uma linha vazia se o arquivo de entrada não contiver nenhum parágrafo (está vazio ou contém apenas linhas vazias). Para proteger-se contra isso, você pode alterar o texto acima para:

awk -v RS= 'END{if (NR) print}' < file.txt

( NR é o número de registros (neste caso parágrafos ) no arquivo).

    
por 11.10.2016 / 13:53
2

Supondo que seus parágrafos estejam separados por linhas em branco, o seguinte comando deve funcionar (substitua as três ocorrências de "teste" por qualquer nome de arquivo):

tail -n 'expr $(wc -l test | cut -f1 -d' ') - \
              $(grep -ERn '^$' test | tail -n1 | grep -o '[0-9]\+')' test

Tenho certeza de que há uma solução muito mais simples, aqui estou procurando a última linha em branco com grep -ERn '^$' test | tail -n1 e removendo tudo antes com o primeiro tail

    
por 11.10.2016 / 12:38
1

Supondo que não haja linhas vazias à direita na sua entrada, você pode executar:

sed 'H;/^$/h;$!d;x' infile

Isso substitui o espaço de espera pelo conteúdo de cada parágrafo, excluindo o espaço de padrão, exceto quando na última linha, quando ele troca buffers. Note que você terá uma linha vazia na saída, mas é fácil de remover ... Vou deixar como um exercício para você.

    
por 11.10.2016 / 13:55
1

mash de tac e sed . Assume que a linha em branco separa os parágrafos

$ cat ip.txt 
some words
in 1st para

some in 2nd one

and few words in last para
as well.

Se a linha em branco na saída estiver correta:

$ tac ip.txt | sed -n '1,/^$/p' | tac

and few words in last para
as well.

Se não:

$ tac ip.txt | sed -n '1,/^$/{/^$/!p}' | tac
and few words in last para
as well.

E se houver espaços em branco na linha em branco, use /^\s*$/ em vez de /^$/


com o modo de parágrafo de perl :

$ perl -00 -ne 'print if eof' ip.txt 
and few words in last para
as well.
    
por 11.10.2016 / 15:43
0

Elaborando a resposta do CaptainCap , você pode fazer algo mais simples com awk :

tail -n$(tac myFile.txt | awk '/^$/{print NR-1; exit}') myFile.txt

Supondo que os parágrafos são separados por linhas vazias (ou contendo apenas espaços em branco).

EDIT: ficou confuso entre tac e rev , você precisa usar tac para que funcione de fato.

EDIT: se você está preocupado com o rastreamento de linhas vazias no seu arquivo, aqui está uma maneira de contorná-las em awk :

tail -n $(tac myFile.txt | \
          awk 'BEGIN{i=1} /^$/{if (NR == i) {i++} else {print NR-1; exit}}') \
     myFile.txt

Testado, parece funcionar como pretendido!

    
por 11.10.2016 / 13:38