linux - tutorial - puertos elasticsearch




¿Cómo usar sed para extraer líneas en el orden especificado? (2)

¿Puedes usar también otros comandos de bash? En ese caso esto funciona:

for i in 200 33 40000; do 
    sed -n "${i}p" inputFile.txt
done > outputFile.txt

Probablemente esto sea más lento que usar array dentro de sed, pero es más práctico.

Tengo un archivo que tiene una longitud de ~ 50,000 líneas y necesito recuperar líneas específicas. He intentado el siguiente comando:

sed -n 'Np;Np;Np' inputFile.txt > outputFile.txt

('N' son las líneas específicas, quiero extraer)

Esto funciona bien, pero el comando extrae las líneas en ORDEN (es decir, PIDE PEDIDOS mi entrada) ej. si lo intento

sed -n '200p;33p;40,000p' inputFile.txt > outputFile.txt

Recibo un archivo de texto con las líneas ordenadas como: 33, 200, 40,000 (lo cual no funciona para mi propósito). ¿Hay alguna manera de mantener el orden en que aparecen las líneas en el comando?


Debe mantener la línea 33 hasta que haya visto la línea 200:

sed -n '33h; 200{p; g; p}; 40000p' file

Vea el manual para una explicación más detallada: https://www.gnu.org/software/sed/manual/html_node/Other-Commands.html

awk podría ser más legible:

awk '
    NR == 33    {line33 = $0} 
    NR == 200   {print; print line33} 
    NR == 40000 {print}
' file 

Si tiene un número arbitrario de líneas para imprimir en un orden específico, puede generalizar esto:

awk -v line_order="11 3 5 1" '
    BEGIN {
        n = split(line_order, inorder)
        for (i=1; i<=n; i++) linenums[inorder[i]]
    }
    NR in linenums {cache[NR]=$0}
    END {for (i=1; i<=n; i++) print cache[inorder[i]]}
' file




sed