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

FileA.txt

1.

2.

3.

FileB.txt

азбука

DEF

ГХИ

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

output.txt

1.азбука

2.DEF

3.ГХИ

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

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

6 ответов6

3

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

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

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

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

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

1

В 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

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

1

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

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

Общее решение для 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

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

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

    1. 1, Shift - G (перейти к началу файла).
    2. Контроль - 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 по вертикали, скопируйте и вставьте в другой файл.

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .