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 == 1Sería más legible en mi opinión.Usando
split(GNU coreutils):-ngenerarCHUNKSarchivos de saliday
CHUNKScomor/K/Nuse 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
1y4en$ny$ivariables: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 tirandoiterlíneas desde la parte superior del archivo y luego solo genera la última. A continuación, incrementaiterporskipsy se repite mientras el valor deiterno ha excedido ellinesenfile.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-topció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
mapfilela 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
printfincorporado; el código de formato%.0ssuprime 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
inputantes de alimentarlomapfile, lo que creo que es más problemático de lo que vale la pena. .Esto también funciona:
Aquí,
printfconsume cuatro entradas de la matrizlinesa 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