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.