Mám dva paralelní soubory se stejným počtem řádků ve dvou jazycích a plánuji tyto dva soubory sloučit řádek po řádku s oddělovačem |||
. Např. dva soubory jsou následující:
Soubor 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.
Soubor 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.
Očekávaný výstup je takovýto:
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.
Zkusil jsem paste
příkaz jako:
paste -d "|||" fileA fileB
Ale vrácený výstup obsahuje pouze jeden kanál, například:
1Mo 1,1 I love you. |1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. |1Mo 1,2 Ich mag dich.
Existuje nějaký způsob, jak oddělit každou dvojici linek pomocí dršťkové trubky |||
?
Přijatá odpověď:
S pastou POSIX:
:|paste -d ' ||| ' fileA - - - - fileB
paste
zřetězí odpovídající řádky všech vstupních souborů. Zde máme šest souborů, fileA
, čtyři fiktivní soubory ze standardu v -
a fileB
.
Seznam oddělovačů obsahuje mezeru, tři čáry a mezeru v tomto pořadí použije paste
kruhově.
Pro první řádek ze šesti souborů fileA
bude zřetězen s prvním fiktivním souborem (což není nic, díky operátoru no-op :), vytvoří line1-fileA<space>
.
První fiktivní soubor bude zřetězen s druhým rourou, vznikne line1-fileA |
, pak druhý fiktivní soubor s třetím fiktivním souborem, vytvořte line1-fileA ||
, třetí fiktivní soubor se čtvrtým fiktivním souborem, vytvoří line1-fileA |||
.
A čtvrtý fiktivní soubor s fileB
, vytvořte line1-fileA ||| line1-fileB
.
Tento krok se bude opakovat pro všechny řádky, čímž získáte očekávaný výsledek.
Použití :|
je pro méně psaní a používá se hlavně v interaktivním prostředí. Ve skriptu byste měli použít:
</dev/null paste -d ' ||| ' fileA - - - - fileB
aby se zabránilo vytvoření podslupky.