Entrada:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
Rendimiento esperado:
1
2
3
4
Entonces, necesito tener solo el 1er, 5to, 9no, 13er valor del archivo en el archivo de salida. ¿Como hacer esto?
text-processing
Velu
fuente
fuente
sed -n '1~4p'
Respuestas:
Usando AWK:
Descubrir cómo funciona esto se deja como un ejercicio para el lector.
fuente
NR % 4 == 1
Sería más legible en mi opinión.Usando
split
(GNU coreutils):-n
generarCHUNKS
archivos de saliday
CHUNKS
comor/K/N
use la distribución round robin y solo envíe Kth of N a stdout sin dividir líneas / registrosfuente
Con GNU
sed
:Con estándar
sed
:Con
1
y4
en$n
y$i
variables:fuente
Agregando la solución perl obligatoria:
fuente
Versión de Python, solo por diversión:
fuente
enumerate(f)
debería poder hacer el trabajo mientras consume menos memoriareadlines
(por lo tanto, arrastrando todo el archivo a la memoria), puede usarlof.readlines()[::4]
para obtener cada cuarta línea. Entonces puedes usarprint(''.join(f.readlines()[::4]))
.POSIX sed
: este método utiliza el posixly sed y, por lo tanto, se puede ejecutar en todas partes, o al menos aquellos seds que respetan posixly.Otra es una generación programática de código sed para fines de escalabilidad:
Perl
: rellenamos la matriz A hasta que tenga un tamaño de 4. Luego imprimimos su primer elemento y también limpiamos la matriz.fuente
Llame con
scriptname filename skip
(4 en su caso) Funciona tirandoiter
líneas desde la parte superior del archivo y luego solo genera la última. A continuación, incrementaiter
porskips
y se repite mientras el valor deiter
no ha excedido ellines
enfile
.fuente
Golpe puro:
mapfile es un archivo incorporado en Bash 4 que lee la entrada estándar en una matriz, aquí llamada
lines
, con una línea por entrada. La-t
opción elimina las nuevas líneas finales.Si desea imprimir cada cuarta línea a partir de la línea 4, puede hacerlo en un comando utilizando
mapfile
la opción de devolución de llamada-C
, que ejecuta el código proporcionado cada tantas líneas, con el intervalo dado por-c
. El índice de matriz actual y la siguiente línea a asignar se dan al código como argumentos.Esto usa el
printf
incorporado; el código de formato%.0s
suprime el primer argumento (el índice), por lo que solo se imprime la línea.Podría usar el mismo comando para imprimir cada cuarta línea a partir de la línea 1, 2 o 3, pero tendría que anteponer 3, 2 o 1 líneas
input
antes de alimentarlomapfile
, lo que creo que es más problemático de lo que vale la pena. .Esto también funciona:
Aquí,
printf
consume cuatro entradas de la matrizlines
a la vez, solo imprime la primera y omite las otras tres con%.0s
. No me gusta esto, ya que tienes que manipular manualmente la cadena de formato para diferentes intervalos o puntos de partida.fuente