Tengo dos archivos paralelos con el mismo número de líneas en dos idiomas y planeo fusionar estos dos archivos línea por línea con el delimitador |||
. Por ejemplo, los dos archivos son los siguientes:
Archivo A:
1Mo 1,1 I love you.
1Mo 1,2 I like you.
Hi 1,3 I am hungry.
Hi 1,4 I am foolish.
Archivo B:
1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.
Hi 1,3 Ich habe Durst.
Hi 1,4 Ich bin neu.
El resultado esperado es así:
1Mo 1,1 I love you. ||| 1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. ||| 1Mo 1,2 Ich mag dich.
Hi 1,3 I am hungry. ||| Hi 1,3 Ich habe Durst.
Hi 1,4 I am foolish. ||| Hi 1,4 Ich bin neu.
Probé paste
comando como:
paste -d "|||" fileA fileB
Pero la salida devuelta solo contiene una tubería como:
1Mo 1,1 I love you. |1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. |1Mo 1,2 Ich mag dich.
¿Hay alguna forma de separar cada par de líneas por tripe pipe |||
? ?
Respuesta aceptada:
Con pasta POSIX:
:|paste -d ' ||| ' fileA - - - - fileB
paste
concatenará las líneas correspondientes de todos los archivos de entrada. Aquí tenemos seis archivos, fileA
, cuatro archivos ficticios del estándar en -
y fileB
.
La lista de delimitadores incluye un espacio, tres conductos y un espacio en ese orden será utilizado por paste
circularmente.
Para la primera línea de seis archivos, fileA
se concatenará con el primer archivo ficticio (que no es nada, gracias al operador no-op :), produce line1-fileA<space>
.
El primer archivo ficticio se concatenará con el segundo mediante una canalización, producirá line1-fileA |
, luego el segundo archivo ficticio con el tercer archivo ficticio, produce line1-fileA ||
, el tercer archivo ficticio con el cuarto archivo ficticio, produce line1-fileA |||
.
Y el cuarto archivo ficticio con fileB
, produce line1-fileA ||| line1-fileB
.
Esos pasos se repetirán para todas las líneas, le darán el resultado esperado.
El uso de :|
es para escribir menos y se usa principalmente en shell interactivo. En un script, debe usar:
</dev/null paste -d ' ||| ' fileA - - - - fileB
para evitar que se genere una subcapa.