2010-10-22 23 views
9

La mayoría de los programas de línea de comandos solo operan en una línea a la vez.Concatenar líneas en Bash

¿Puedo usar una utilidad común de línea de comandos (echo, sed, awk, etc.) para concatenar cada conjunto de dos líneas, o necesitaría escribir un script/programa desde cero para hacer esto?

$ cat myFile 
line 1 
line 2 
line 3 
line 4 

$ cat myFile | __somecommand__ 
line 1line 2 
line 3line 4 

Respuesta

11
sed 'N;s/\n/ /;' 

Coge la línea siguiente, y el carácter de nueva línea sustituto con el espacio.

seq 1 6 | sed 'N;s/\n/ /;' 
1 2 
3 4 
5 6 
+3

OT, pero use 'seq 1 6' en lugar de su comando' echo'. –

+0

@glenn: Gracias. Siempre hay algo nuevo que aprender en UNIX ... –

+0

'printf"% s \ n "{1..6} | sed 'N; s/\ n//;' '. – ghostdog74

8
$ awk 'ORS=(NR%2)?" ":"\n"' file 
line 1 line 2 
line 3 line 4 

$ paste - - < file 
line 1 line 2 
line 3 line 4 
+3

+1 para la pasta. Tenga en cuenta que el delimitador predeterminado es tabulador, use '-d" "' si realmente desea que sus líneas se unan. –

+0

+1 pega;) ¡lindo! – itshorty

1

No es un comando en particular, pero este fragmento de la cáscara debe hacer el truco:

cat myFile | while read line; do echo -n $line; [ "${i}" ] && echo && i= || i=1 ; done 
+1

UUOC. 'mientras lee la línea; hacer eco -n $ línea; ["$ {i}"] && echo && i = || i = 1; hecho ghostdog74

+0

Heh, no estaba familiarizado con UUOC hasta que publicó eso. Para casos simples, todavía creo que el gato es más claro incluso si es un poco más lento y pierde un proceso. :-) – kanaka

+1

más claro? ¿Qué no está tan claro sobre la redirección de entrada? :) – ghostdog74

1

También puede utilizar Perl como:

$ perl -pe 'chomp;$i++;unless($i%2){$_.="\n"};' < file 
line 1line 2 
line 3line 4 
+0

Cualquier consejo sobre cómo hacer que este one-liner sea más corto son bienvenidos :) – codaddict

+0

'perl -ne 'chomp ($ p = $ _); $ q = <>; imprime $ p, $ q 'archivo' –

+0

@glenn: Eso está bien. Gracias. – codaddict

1

Aquí hay una versión script de shell que no necesita para cambiar una bandera:

while read line1; do read line2; echo $line1$line2; done < inputfile 
Cuestiones relacionadas