Necesito quitar líneas impares en un archivo de texto para hacer un muestreo. He encontrado este comando,

awk 'NR%2==0' file

pero sólo imprime las líneas impares en el terminal. Cómo realmente eliminarlos?

Yo realmente no se preocupan por pares o impares, quiero quitar del archivo o imprimirse en otro archivo. Esto sólo imprime en el terminal.

  • ¿Estás seguro de que awk 'NR%2==0' file imprime líneas impares?
  • editado.
InformationsquelleAutor SamuelNLP | 2014-01-23

6 Comentarios

  1. 68

    awk

    La % es un operador de módulo y NR es el número de línea actual, por lo que NR%2==0 es cierto sólo para las líneas y va a invocar la regla predeterminada para ellos ({ print $0 }). Así guardar sólo las líneas, la redirección de la salida de awk a un nuevo archivo:

    awk 'NR%2==0' infile > outfile

    sed

    Puede lograr lo mismo con sed. devnulls respuesta muestra cómo hacerlo con GNU sed.
    A continuación son las alternativas para las versiones de sed que no tienen la ~ operador:

    mantener líneas impares

    sed 'n; d' infile > outfile

    mantener las líneas

    sed '1d; n; d' infile > outfile
    • Ok,yo realmente no se preocupan por pares o impares, quiero quitar del archivo o imprimirse en otro archivo. Esto sólo imprime en el terminal.
    • Gracias. 🙂 Funciona.
    • Grandes cosas; sólo para completar la imagen: awk 'NR%2!=0' infile > outfile guarda el extraño líneas; con awk, no se puede reemplazar el archivo de entrada en lugar de, con sed, usted puede: usar la opción -i '' (en Linux, -i funciona, también).
  2. 12

    Usando GNU sed:

    sed -i '0~2d' filename

    para eliminar los pares de líneas del archivo.

    Para la eliminación de números impares líneas:

    sed -i '1~2d' filename

    La -i opción sería hacer que los cambios se guardan en el archivo en el lugar.

    Citando el manual:

    `FIRST~STEP'
         This GNU extension matches every STEPth line starting with line
         FIRST.  In particular, lines will be selected when there exists a
         non-negative N such that the current line-number equals FIRST + (N
         * STEP).  Thus, to select the odd-numbered lines, one would use
         `1~2'; to pick every third line starting with the second, `2~3'
         would be used; to pick every fifth line starting with the tenth,
         use `10~5'; and `50~0' is just an obscure way of saying `50'.
    • A los grandes, para salvar a otros de un viaje a man sed: dirección m~n significa: «comenzar con la línea m y coincide nunca la n-ésima línea después de» (y d significa «eliminar»).
  3. 5

    No se enfocan en lo negativo (la eliminación de las líneas), se centran en lo positivo (seleccionar líneas) y la solución va a seguir el ejemplo. Así que en lugar de I need to remove odd lines usted debe estar pensando I need to select even lines y, a continuación, la solución es simple:

    awk '!(NR%2)' file

    Si quieres guardar el resultado en un archivo nuevo:

    awk '!(NR%2)' file > newfile

    o volver a la original:

    awk '!(NR%2)' file > newfile && mv newfile file
  4. 3

    He aquí un awk ejemplo, para crear dos nuevos ficheros que contienen las líneas pares e impares, respectivamente:

    awk '{ if (NR%2) print > "odd.txt"; else print > "even.txt" }' input.txt
    • ITYM utilizar >, no >> (recuerda que esto es awk, no shell). También, se puede abreviar de la totalidad de la cosa { print > ((NR%2?"odd":"even") ".txt") }
    • Punto válido, aunque si ninguno de los archivos que existía con anterioridad, son bastante equivalentes. Y el código abreviado, al menos para mí, es un poco menos fácil de leer, así, mientras que yo podría hacerlo para los scripts que mantener, no siempre recomendamos que el nivel de sequedad de los demás…
  5. 3

    Esto podría funcionar para usted (GNU sed):

     sed -n 'p;n' file # keep odd
     sed -n 'n;p' file # keep even
    • Puede usted explicar el trabajo detrás de este comando
  6. 1

    Perl solución para la impresión de iguala nuevo archivo:

    perl -lne 'print if $. % 2 == 0' infile > outfile

    Para imprimir probabilidades, cambio == 1 a == 0

    $. es el número de línea

    Mantiene sólo la iguala en el archivo original:

    perl -i -lne 'print if $. % 2 == 0' infile

    Igual que el anterior, pero hace un archivo de copia de seguridad llamado infile.bak:

    perl -i.bak -lne 'print if $. % 2 == 0' infile

Dejar respuesta

Please enter your comment!
Please enter your name here