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 / 10: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 / 11: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 / 10: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 / 11: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 / 13: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 / 11:38
yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warning – yii\base\ErrorException

PHP Startup: Unable to load dynamic library 'memcached.so' (tried: /usr/lib/php/20190902/memcached.so (/usr/lib/php/20190902/memcached.so: undefined symbol: igbinary_serialize), /usr/lib/php/20190902/memcached.so.so (/usr/lib/php/20190902/memcached.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '815934',
    'url' => 'how-to-display-the-final-paragraph-of-a-text-document',
];

$_COOKIE = [
    'advanced-frontend' => 'bfned8safi4qi31hcro8c3l0l3',
    '_csrf-frontend' => 'bb93e9a18564f736b0ff7aa842ba3913729c5bd50e8c669e661a6d0228998b60a:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"IEBnuCcHg-RMDdvJcSUIe_Qd388SIkE7";}',
];

$_SESSION = [
    '__flash' => [],
];