Ho due file paralleli con lo stesso numero di righe in due lingue e ho intenzione di unire questi due file riga per riga con il delimitatore |||
. Ad esempio, i due file sono i seguenti:
File 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.
File 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.
L'output previsto è questo:
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.
Ho provato a paste
comando come:
paste -d "|||" fileA fileB
Ma l'output restituito contiene solo una pipe come:
1Mo 1,1 I love you. |1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. |1Mo 1,2 Ich mag dich.
C'è un modo per separare ogni coppia di linee con una trippa |||
?
Risposta accettata:
Con pasta POSIX:
:|paste -d ' ||| ' fileA - - - - fileB
paste
concatenerà le righe corrispondenti di tutti i file di input. Qui abbiamo sei file, fileA
, quattro file fittizi dallo standard in -
e fileB
.
L'elenco dei delimitatori include uno spazio, tre pipe e uno spazio nell'ordine che verrà utilizzato da paste
circolarmente.
Per la prima riga di sei file, fileA
verrà concatenato con il primo file fittizio (che non è nulla, grazie all'operatore no-op :), produrrà line1-fileA<space>
.
Il primo file fittizio sarà concatenato con il secondo da una pipe, produrrà line1-fileA |
, quindi il secondo file fittizio con il terzo file fittizio, producono line1-fileA ||
, il terzo file fittizio con il quarto file fittizio, produce line1-fileA |||
.
E il quarto file fittizio con fileB
, produrre line1-fileA ||| line1-fileB
.
Questi passaggi verranno ripetuti per tutte le righe, dandoti il risultato atteso.
L'uso di :|
è per la digitazione ridotta e viene utilizzato principalmente nella shell interattiva. In uno script, dovresti usare:
</dev/null paste -d ' ||| ' fileA - - - - fileB
per impedire la generazione di una subshell.