uso tutorial español editar comando buscar vim sed large-files text-processing

tutorial - uso de vim



¿Cómo puedo unir pares de líneas consecutivas en un archivo grande(1 millón de líneas) utilizando vim, sed u otra herramienta similar? (7)

Necesito mover el contenido de cada segunda línea hasta la línea superior, de modo que los datos de la línea 2 se encuentren junto a la línea 1, ya sea en coma o en espacios separados.

Entrada:

line1 line2 line3 line4

Salida:

line1 line2 line3 line4

Lo he estado haciendo en vim con una grabación simple, pero parece que se cuelga cuando le digo que lo haga 100 000 veces ... Estoy pensando que tal vez Sed sería una buena alternativa, pero no estoy seguro de cómo hacer lo que quiero o tal vez hay una mejor opción?

Cada línea solo contiene 1 valor numérico, solo tengo un millón de líneas ...


Esto podría funcionar para usted:

sed ''N;s//n/ /'' file

O

cat file | paste -d'' '' - -


prueba esto:

sed -rn ''N;s//n/ /;p'' yourFile

prueba con seq:

kent$ seq 10 1 2 3 4 5 6 7 8 9 10 kent$ seq 10|sed -rn ''N;s//n/ /;p'' 1 2 3 4 5 6 7 8 9 10

awk también funciona:

awk ''NR%2{printf $0" ";next;}1'' yourFile

prueba

kent$ seq 10|awk ''NR%2{printf $0" ";next;}1'' 1 2 3 4 5 6 7 8 9 10


Si entiendo correctamente, tienes:

line1 line2 line3 line4 ...

Y tu quieres:

line1<SEP>line2 line3<SEP>line4

entonces puedes hacerlo fácilmente con (g)awk así:

awk ''NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 }'' INPUTFILE

Véalo en acción aquí .

Actualización : si el número de líneas es impar, lo anterior omitirá la última línea (como señaló Martin Stettner) así que esto no:

awk ''NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 } END { if ( NR % 2 == 1 ) { print o } }'' INPUTFILE

HTH


$ seq 10 | sed ''2~2G'' | awk -v RS='''' ''{$1=$1; print}'' 1 2 3 4 5 6 7 8 9 10

$ paste -d'' '' <(sed -n ''p;n'' num.txt) <(sed -n ''n;p'' num.txt) 1 2 3 4 5 6 7 8 9 10

$ echo -e ''g/^/,+1j/n%p'' | ex num.txt 1 2 3 4 5 6 7 8 9 10

$ seq 10 | awk ''NR%2{printf("%s ", $0); next}1'' 1 2 3 4 5 6 7 8 9 10

$ seq 10 | sed ''N;s//n/ /'' 1 2 3 4 5 6 7 8 9 10

nota: $ seq 10 >num.txt


Bueno, tu ejemplo es esto en Vim.

:g/^/+t.|-j

Pero entonces, ¿qué pasa con la última línea?

¿O lo dijiste en serio?

:g/^/j

Es posible que también le interese este script de Vim, que facilita el manejo de archivos de gran tamaño.

http://www.vim.org/scripts/script.php?script_id=1506


El comando pegar puede hacer esto. Su opción "-s" unirá líneas consecutivas; y la opción "-d" especifica una lista de caracteres para usar como delimitadores, repitiéndolos cíclicamente. Únete primero con un espacio, luego con una línea nueva, y repite:

seq 10 | paste -sd" /n" -


seq 10 | awk ''ORS=NR%2?FS:RS''

Esta solución usa "operador ternario" para establecer ORS

ORS= ....... output register separator (will receive =) NR%2 ....... test if it has division remainder of Number of Register by 2 ?FS:RS ..... FS = "space" RS = "/n" (newline)