cabeça; cabeça
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
Com o exposto acima, você pode especificar o primeiro número de linhas a partir da cabeça da saída com o primeiro comando head
e o número de linhas a serem gravadas em outfile
com o segundo. Ele normalmente também faz isso mais rápido que sed
- especialmente quando a entrada é grande - apesar de exigir duas invocações. Onde sed
definitivamente deve ser preferível, no caso em que <infile
não é um arquivo regular, lseekable - porque isso normalmente não funcionam como pretendido nesse caso, mas sed
pode manipular todas as modificações de saída em um único processo com script.
Com um% GNUhead
você pode usar o formulário -
negativo para [num]
no segundo comando também. Nesse caso, o comando a seguir tira as primeiras e últimas linhas da entrada:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
OU com um POSIX sed
:
Digamos, por exemplo, que eu estava lendo uma entrada de 20 linhas e queria remover as 3 primeiras e as 7 últimas. Se eu resolvesse fazer isso com sed
, faria isso com um buffer de cauda. Eu adicionaria primeiro três e sete para uma contagem total de dez e depois faria:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Esse é um exemplo que retira as primeiras 3 e últimas 7 linhas da entrada. A ideia é que você possa armazenar em buffer tantas linhas quanto desejar retirar da cauda de entrada no espaço de padrão em uma pilha, mas apenas P
rint o primeiro para cada linha extraída.
- Nas linhas
1,10
sed
P
rints nada porque, para cada uma delas, é empilhamento de entrada no espaço de padrão linha por linha em um loop de rancho b
.
- Na terceira linha, toda a pilha de
sed
é d
eleted - e, portanto, as primeiras 3 linhas são removidas da saída de uma só vez.
- Quando
sed
alcança a última linha de entrada $
e tenta extrair o N
ext, ele atinge o EOF e pára completamente o processamento. Mas nesse momento, o espaço padrão contém todas as linhas 14,20
- nenhuma delas foi P
rinted e nunca é.
- Em todas as outras linhas
sed
P
rints até o primeiro \n
ewline no espaço de padrões, e D
é igual antes de iniciar um novo ciclo com o que resta - ou as próximas 6 linhas de entrada . A 7ª linha é anexada novamente à pilha com o comando N
ext no novo ciclo.
E assim, da saída de seq
(que é 20 linhas numeradas sequencialmente) , sed
apenas imprime:
4
5
6
7
8
9
10
11
12
13
Isso pode ser problemático quando o número de linhas que você deseja remover da cauda de entrada é grande - porque o desempenho de sed
é diretamente proporcional ao tamanho de seu espaço de padrão. Ainda assim, no entanto, é uma solução viável em muitos casos - e o POSIX especifica um espaço de padrão sed
para lidar com pelo menos 4 kb antes de rebentar.