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
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.
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)