Объединять файлы построчно

1196
Kard Nails

Для примера у меня есть два файла:

FileA.txt

1.

2.

3.

FileB.txt

азбука

DEF

ГХИ

И я хочу объединить, чтобы получить:

output.txt

1.ABC

2.DEF

3.GHI

Мне нужно объединить каждую строку, поместив содержимое одного файла в начало строки и содержимое другого файла после нее. Я не могу сделать это вручную, так как есть более 30 000 строк. Я на Windows, но я могу установить Linux при необходимости.

Я провел поиск на этом сайте и в Интернете в целом, но нашел только очень старые и устаревшие публикации, решения, объединяющие несколько файлов, но не построчно, или те, которые требуют слишком много знаний в области кодирования, которых мне не хватает. Я также пытался использовать Excel для объединения двух столбцов, но я не могу обойти ограничение в 256 символов. Если на это уже есть ответ, извините, я пропустил его. Любая помощь приветствуется. Спасибо.

0
Я бы использовал тот же подход. Где вы получили ограничение в 256 символов? Sandeep 6 лет назад 0
@Sandeep При использовании функции Flash Fill в Excel я получаю сообщение, что мне следует пересмотреть все автоматические слияния, так как часть содержимого была обрезана из-за ограничения в 256 символов. Kard Nails 6 лет назад 0
Я скопировал бы содержимое файла FileA.txt в столбце A Excel и содержимое файла FileB.txt в столбце B. Затем сохраните файл `.txt`. Откройте этот файл `.txt` в` Notepad ++ `и замените символ` TAB` между значениями на `.`. Sandeep 6 лет назад 2
@Sandeep Это было проще, чем я себе представлял. Спасибо. Если вы отправите ответ, я приму его. Kard Nails 6 лет назад 0
Я добавил свой ответ. Sandeep 6 лет назад 0

6 ответов на вопрос

3
kenorb

Используйте pasteкоманду, например

$ paste FileA.txt FileB.txt  1. ABC 2. DEF 3. GHI 

Примечание. Добавьте, -d' 'чтобы избежать добавления пробелов между столбцами.

Для того, чтобы перенаправить вывод в новый файл, добавьте: > NewFile.txt.

В Windows вы можете установить Git Shell или Cygwin . Или используйте Docker для Windows .

Я забыл о `paste`, который является очевидным решением, хотя в примере в вопросе нет разделителя между строками каждого файла: для этого вам нужен` paste -d "" FileA.txt FileB.txt` , AFH 6 лет назад 0
Как мне создать новый файл прямо из вывода? Это длинный файл ... Kard Nails 6 лет назад 0
Просто перенаправьте в новый файл, например: `> new_file.txt`. kenorb 6 лет назад 0
1
JoeSlav

В linux - простая команда, использующая преимущества diff (которая по умолчанию установлена ​​практически во всех системах unix / linux) и ее -yфлаг (параллельное сравнение), sedкоторая удаляет ненужные пробелы / табуляции, вставленные процессом diff.

$ diff -y 1.txt 2.txt | sed 's/\s*|\t*//g' 1.a 2.b 3.c 

Учитывая файлы 1.txt :

1. 2. 3. 

и 2.txt :

a b c 

Выше предполагается, что у вас есть файлы с одинаковым количеством строк, и что каждая строка отличается, что, кажется, имеет место из вашего вопроса.

Извини, но что? Что такое diff и что это за лайнер? Как я уже сказал, мои знания довольно ограничены. Kard Nails 6 лет назад 0
Пытался сделать это более объяснительным. JoeSlav 6 лет назад 0
1
AFH

Общее решение для Linux:

E1=""; E2="" { while true do read -r <&3 && l1="$REPLY" || l1="" E1=e read -r <&4 && l2="$REPLY" || l2="" E2=e [ "$E1$E2" == ee ] && break echo "$l1$l2" done } 3<"$1" 4<"$2" 

Я отформатировал это как сценарий для разборчивости, но он может быть введен в виде длинной командной строки, заменяя новую строку с запятой, и заменяя $1и $2на пути к файлам, которые будут объединены.

Это работает следующим образом:

  • E1и E2являются флагами конца файла;
  • Два входных потока (3 и 4) открываются из двух пройденных путей к файлам;
  • Строка читается из каждого файла и устанавливается в переменных l1и l2соответственно;
  • Обратите внимание, что read -r l1убирает начальные и конечные пробелы, следовательно, более сложный код для установки l1l2);
  • Цикл завершается, когда оба файла достигают EOF, хотя это тривиальная модификация для завершения любого файла, достигающего EOF;
  • Он echoбудет стандартным, или >"$3"может быть добавлен в строку, что делает выходной файл третьим параметром;
  • Команда echoможет быть расширена, если вы хотите добавить строку разделителя, чтобы отделить текст от каждого файла.

Приведенный выше сценарий должен работать в WSL (Windows Subsystem for Linux) в Windows 10 или CygWin в более ранних выпусках Windows.

Это было бы возможно реализовать cmd, но я бы не хотел пытаться, хотя это было бы просто в cmdбесплатной замене TCC / LE . Это также возможно с PowerShell, но я не очень разбираюсь в этом, поскольку использую в основном Linux.

1
kenorb

Используйте редактор Vim, например

  1. Откройте два файла бок о бок: vim FileA.txt FileB.txt -O.
  2. В первом файле вертикально выберите 2 столбца, нажав следующие клавиши:

    1. 1, Shift- G(перейти к началу файла).
    2. Control- V(войдите в режим визуального блока).
    3. Shift- G, $(выберите два столбца).
    4. y (дергать / копировать в буфер).
  3. Переход к следующему файлу, нажав: Control- w, w.
  4. Убедитесь, что вы находитесь в первой строке: 1, Shift- G.
  5. В первой строке нажмите: Shift- Pвставить вертикально.
  6. Сохранить и выйти ( :wq).

Смотрите демо:

asciicast


Чтобы автоматизировать вышеуказанные шаги для больших файлов, либо запишите макрос и запустите его снова, либо вы можете использовать exкоманду (часть Vim) для редактирования файлов неинтерактивно, например, смотрите: Как редактировать файлы неинтерактивно (например, в трубопровод)?

Go может достичь аналогичного в Sublime Text, либо используя плагин Vintage (Vim), либо выбрав столбец с Altвертикальной версией, скопируйте и вставьте в другой файл.

1
RProgram

Используйте редактор CudaText с функцией множественного выбора.

  • Выбрать все в файле-1
  • Вызвать «Выделение / Разбить выделение на строки» в файле-1
  • Выбрать все в файле-2
  • Вызвать «Выделение / Разбить выделение на строки» в файле-2
  • Копировать в буфер обмена (много строк) в файле-2
  • В файле-1, нажмите Конец, чтобы поместить каретки к концам строки
  • !! Убедитесь, что количество кареток в файле-1 равно количеству строк, скопированных в буфер обмена (если ненужная каретка в конце - Ctrl + щелкните по ней, чтобы удалить ее)
  • Если они равны, в конце строки нажмите Ctrl + V (Вставить) - это вставляет буфер обмена построчно
0
Sandeep

Для этого можно предпринять следующие шаги:

  1. Скопируйте содержимое файла FileA.txtв столбце A листа Excel
  2. Скопируйте содержимое файла FileB.txtв столбце B листа Excel
  3. Сохранить файл Excel как .txtфайл
  4. Открыть .txtфайл вNotepad++
  5. Заменить TABсимвол на `. '