У меня есть два параллельных файла с одинаковым количеством строк на двух языках, и я планирую объединить эти два файла построчно с разделителем |||
. Например, два файла следующие:
Файл А:
1Mo 1,1 I love you.
1Mo 1,2 I like you.
Hi 1,3 I am hungry.
Hi 1,4 I am foolish.
Файл Б:
1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.
Hi 1,3 Ich habe Durst.
Hi 1,4 Ich bin neu.
Ожидаемый результат выглядит так:
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.
Я попробовал paste
команду, такую как:
paste -d "|||" fileA fileB
Но возвращенный вывод содержит только одну трубу, такую как:
1Mo 1,1 I love you. |1Mo 1,1 Ich liebe dich.
1Mo 1,2 I like you. |1Mo 1,2 Ich mag dich.
Есть ли способ разделить каждую пару линий по трубе |||
?
text-processing
sed
awk
нахмуриться
источник
источник
paste -d '|||' fileA - - fileB < /dev/null
Ответы:
С пастой POSIX :
paste
объединит соответствующие строки всех входных файлов. Здесь у нас есть шесть файлов,fileA
четыре фиктивных файла из стандартного файла-
, иfileB
.Список разделителей включает пробел, три трубы и пробел в том порядке, который будет использоваться по
paste
кругу.Для первой строки из шести файлов,
fileA
будут объединены с первым фиктивным файлом (что ничего, спасибо оператору no-op :), производимline1-fileA<space>
.Первый фиктивный файл будет соединен со вторым с помощью канала, а
line1-fileA |
затем второй фиктивный файл с третьим фиктивным файлом.line1-fileA ||
Третий фиктивный файл с четвертым фиктивным файломline1-fileA |||
.И четвертый пустышка
fileB
, производятline1-fileA ||| line1-fileB
.Эти шаги будут повторяться для всех строк, чтобы получить ожидаемый результат.
Используется
:|
для меньшего набора текста и в основном используется в интерактивной оболочке. В скрипте вы должны использовать:чтобы предотвратить появление подоболочки.
источник
:|
. умная альтернатива</dev/null
- - - -
, но в следующий раз вы даже можете написать пару строк для объяснения :):|paste -d '|' fileA - - fileB
дает более правильную версию без разделителя пробелов.Ну, это не использует sed, awk или grep, но вы можете сделать это довольно легко в bash. Команда:
Проблема с пастой заключается в том, что разделитель представляет собой один символ. Вы также можете вставить один символ и использовать sed для его преобразования, но это может привести к ошибкам, если этот символ уже появился во входном файле.
источник
IFS=
перед каждымread
. Вы можете легко сделать это сpaste
. Смотрите мой ответ , а также этот, чтобы понять, почему следует избегать использованияwhile
цикла в сценарии оболочки.Версия awk (GNU)
С помощью
getline
команды inawk
вы можете установить$0
(все переменные для столбцов) из следующей входной записи, еслиgetline < "filename"
вы установите следующую$0
из указанного файла.Почему ваша попытка не сработала так, как вы ожидаете? Из
man paste
мы можем прочитатьно он использует разделители по одному для каждого столбца .
Таким образом, команда
paste -d '|*|*' fileA fileB fileA fileB
дает мне строки какsed
Решение , которое я предлагаю , чтобы избежать даже если близко к первоначальной попытке, потому что она исправляет полученное поведение к первоначальной цели:Чтобы избежать, потому что вы заменяете каждый шаблон
|
новым|||
, но вы должны предположить, что символ канала (|
) не присутствует в ваших данных , иначе вам придется иметь дело с особыми случаями и сделать более сложный код, чтобы избежать побочных эффектов.Вариант с конструкцией Here String [ 1 ]
<<<
Вы устанавливаете 5 разделителей с помощью
-d ' ||| '
(пробел, |, |, |, пробел) и 4 фиктивных файлов (- - - -
), которые будут принимать данные из пустой строки''
.Протестировано на GNU Awk 4.0.1, paste (GNU coreutils) 8.21 и sed (GNU sed) 4.2.2
источник
sed
пример, чтобы избежать (:-)) и больше комментариев.Если вы хотите избежать магии и драматизма круговых разделителей и фиктивных файлов, вы можете просто добавить свой разделитель в один файл перед вставкой:
дает
источник
Вы можете сделать это в Python тоже таким образом.
источник