Entrada:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
Saída esperada:
1
2
3
4
Então, eu preciso ter apenas o valor 1, 5, 9, 13 do arquivo no arquivo de saída. Como fazer isso?
text-processing
Velu
fonte
fonte
sed -n '1~4p'
Respostas:
Usando o AWK:
Descobrir como isso funciona é deixado como um exercício para o leitor.
fonte
NR % 4 == 1
seria IMO mais legível.Usando
split
(GNU coreutils):-n
gerarCHUNKS
arquivos de saídae
CHUNKS
comor/K/N
use a distribuição round robin e apenas produza Kth de N no stdout sem dividir linhas / registrosfonte
Com o GNU
sed
:Com padrão
sed
:Com
1
e4
dentro$n
e$i
variáveis:fonte
Adicionando a solução perl obrigatória:
fonte
Versão Python, apenas por diversão:
fonte
enumerate(f)
deve ser capaz de fazer o trabalho enquanto consome menos memóriareadlines
(portanto, colocar o arquivo inteiro na memória), use-of.readlines()[::4]
para obter cada quarta linha. Então você pode usarprint(''.join(f.readlines()[::4]))
.POSIX sed
: esse método usa o posixly sed e pode ser executado em qualquer lugar ou pelo menos nos seds que respeitam o posix.Outra é uma geração programática de código sed para fins de escalabilidade:
Perl
: preenchemos o array A até ele ter 4 de tamanho. Em seguida, imprimimos seu primeiro elemento e também limpamos a matriz.fonte
Ligue com
scriptname filename skip
(4 no seu caso). Ele funciona puxando asiter
linhas da parte superior do arquivo e depois apenas produzindo a última. Em seguida, incrementositer
porskips
e repete, desde que o valor deiter
não ultrapassou olines
nofile
.fonte
Pure Bash:
O mapfile é um built -in adicionado no Bash 4 que lê a entrada padrão em uma matriz, chamada aqui
lines
, com uma linha por entrada. A-t
opção retira as novas linhas finais.Se você deseja imprimir cada quarta linha começando na linha 4, é possível fazer isso em um comando usando
mapfile
a opção de retorno de chamada-C
, que executa o código fornecido a cada tantas linhas, com o intervalo fornecido por-c
. O índice atual da matriz e a próxima linha a ser atribuída são fornecidos ao código como argumentos.Isso usa o
printf
builtin; o código de formato%.0s
suprime o primeiro argumento (o índice), portanto, apenas a linha é impressa.Você pode usar o mesmo comando para imprimir a cada quarta linha, começando na linha 1, 2 ou 3, mas você precisará acrescentar 3, 2 ou 1 linhas
input
antes de alimentá-lomapfile
, o que eu acho que é mais problemático do que vale a pena .Isso também funciona:
Aqui,
printf
consome quatro entradas da matrizlines
por vez, apenas imprimindo a primeira e pulando as outras três%.0s
. Eu não gosto disso, já que você precisa mexer manualmente com a string de formato para diferentes intervalos ou pontos de partida.fonte