Desejo imprimir a primeira e a última linha não vazia ou sem espaço em branco em um arquivo, idealmente usando sed
ou awk
.
- Arquivo de entrada:
Observe que há uma linha em branco após123 345 456 087 er 56 32 78
32 78
. - Saída desejada:
123 345 32 78
Observe que estou respondendo a duas perguntas aqui, pois o texto da pergunta foi modificado:
Como podemos produzir a primeira e a penúltima linha de um arquivo (a pergunta inicial continha a expressão "penúltima linha")?
Como podemos produzir a primeira linha e a última linha não vazia e não em branco?
Usando o
ed
editor, que é um pouco mais flexível com seu endereçamento de linhas do quesed
, principalmente devido à leitura de todos os dados na memória, em vez de uma linha por vez:Isso imprime a primeira e a penúltima linha do arquivo de entrada antes de sair. A penúltima linha é endereçada usando
$-1
, que pode ser abreviado para apenas$-
.Se não soubermos que há exatamente uma linha em branco no final, podemos, em vez disso, procurar na linha 1 uma linha que contenha algo e imprimir isso:
Usando
sed
:Isso primeiro desativa a saída padrão de cada linha com
-n
. Em seguida, imprime a primeira linha. Todas as linhas são salvas no espaço de espera usandoh
, e na última linha, buscamos o espaço de esperag
e o imprimimos. Devido à ordem das duas últimas expressões, isso imprimirá a penúltima linha.Com uma pequena modificação, podemos alterar isso para exibir a última linha não em branco, não importa se é a penúltima ou não:
Com uma combinação de
grep
esed
, podemos primeiro filtrar todas as linhas vazias ou aparentemente vazias e, em seguida, apenas exibir a primeira e a última linhas:Observe que isso também produzirá a primeira linha não vazia, mesmo que esta não seja a primeira linha nos dados originais.
O seguinte
awk
programa fará isso:awk
por padrão, divide as linhas de entrada em campos em "espaço em branco", ou seja, execuções contíguas de espaço e tabulações. O número de campos é armazenado emNF
. Se uma linha estiver completamente vazia, ou consistir apenas em espaços em branco,NF
será zero.NF
diferente de zero e avaliada comotrue
, ele armazena o conteúdo da linha em um bufferlast
. Se esta for a primeira linha desse tipo (a variável do contadorc
será desativada e avaliada comofalse
), ela imprimirá a linha atual. Em qualquer caso, aumentac
para que esta condição só possa ocorrer uma vez, para a primeira linha não vazia.last
, o conteúdo da última linha não vazia, mas apenas ifc>1
, de modo que, se apenas uma única linha não estiver vazia, essa linha será impressa apenas uma vez. Se todas as linhas estiverem vazias,c
será avaliado como 0 e nada será impresso mesmo naEND
cláusula.Conteúdo dos arquivos de teste:
teste
Saída: