Exibe apenas a penúltima (segunda última) linha de um texto [duplicado]

7

Eu tenho um poema com um número desconhecido de linhas e quero exibir apenas o penúltimo. Qual comando devo usar?

    
por Elena 07.05.2018 / 16:06

5 respostas

19

Existem muitas maneiras de fazer isso, mas esta é a mais rápida que eu encontrei - e é a mais limpa na minha opinião.

Supondo que o poema está escrito em um arquivo chamado poem , você pode usar:

tail -n 2 poem | head -n 1

tail -n 2 poem escreve as últimas 2 linhas do arquivo poem .

head -n 1 escreverá a primeira linha da saída fornecida pelo comando tail anterior.

    
por 07.05.2018 / 16:13
6

Use ed, cara!

ed -s poems <<< $'$-1\n'

Isto diz para abrir o arquivo poems no modo de script ( -s ) (para que ele não imprima mensagens extras), então envia um comando de endereçamento em uma string here que diz "vá para o último linha do arquivo ( $ ), menos 1 ", que imprime a linha.

Dado um arquivo de poema de entrada de :

A is for awk, which runs like a snail, and
B is for biff, which reads all your mail.

C is for cc, as hackers recall, while
D is for dd, the command that does all.

E is for emacs, which rebinds your keys, and
F is for fsck, which rebuilds your trees.

G is for grep, a clever detective, while
H is for halt, which may seem defective.

I is for indent, which rarely amuses, and
J is for join, which nobody uses.

K is for kill, which makes you the boss, while
L is for lex, which is missing from DOS.

M is for more, from which Less was begot, and
N is for nice, which it really is not.

O is for od, which prints out things nice, while
P is for passwd, which reads in strings twice.

Q is for quota, a Berkeley-type fable, and
R is for ranlib, for sorting ar sic table.

S is for spell, which attempts to belittle, while
T is for true, which does very little.

U is for uniq, which is used after Sort, and
V is for vi, which is hard to abort.

W is for whoami, which tells you your name, while
X is, well, X, of dubious fame.

Y is for yes, which makes an impression, and
Z is for zcat, which handles compression.

... a saída do resultado é:

Y is for yes, which makes an impression, and
    
por 07.05.2018 / 18:47
5

Você faria

sed '2q;d' <(tac infile)

tac bem imprime o arquivo infile na ordem inversa ao contrário de cat e passa como entrada para sed e isso exclui todas as linhas (aqui apenas a primeira linha) exceto a segunda e depois sai imediatamente. p>

ou alternativamente:

tail -n2 infile | sed '2d'

Ou com sed apenas

sed 'x;$!d' <infile

O sed está lendo uma linha por vez e com espaço de espera x , estamos salvando o processamento de linha atual e o imprimiremos !d (não excluir) uma vez sed ler todas as linhas (ou está na última linha) e como sed só pode ter um espaço de espera, então quando é a última linha, o espaço de espera contém a segunda última linha; isso é o mesmo que:

sed -n 'x;$p' <infile
    
por 07.05.2018 / 16:32
3

Supondo que seu poema esteja no documento de texto poem :

< poem tail -n 2 | head -n 1
    
por 07.05.2018 / 16:09
1

awk

Isto funciona com o GNU awk (Linux) e o BSD awk (Mac).

Você pode querer ignorar linhas em branco. Nesse caso, você pode usar awk 'NF' file.txt e, em seguida, canalizar a saída por meio de um dos outros métodos descritos nesta página.

Você também pode fazer tudo de uma só vez no awk:

awk 'NF { a=b ; b=$0 } END { print a }' file.txt
  • NF
    Apenas linhas de processo que contêm dados. NF representa o número de campos na linha; valores maiores que 0 são tratados como "true".
    • { a=b ; b=$0 }
      Armazena a linha atual não em branco como b e a linha anterior em branco como a .
  • END { print a }
    Depois de examinar o arquivo inteiro, imprima o valor final de a (a penúltima linha não vazia).

Se você não quiser omitir as linhas em branco, basta remover o NF :

awk '{ a=b ; b=$0 } END { print a }' file.txt
    
por 08.05.2018 / 04:59