От определенного числа файлов я должен создать новый файл, где каждая строка текста является последовательностью соответствующих строк из моих исходных файлов. Так, скажем, у меня есть два файла со структурой как это:
File1:
AAAA
BBBB
CCCC
File2:
XXXX
YYYY
ZZZZ
Я должен объединить их для получения результата как:
AAAAXXXX
BBBBYYYY
CCCCZZZZ
Как я могу сделать это из сценария удара?
Используйте paste
команда:
paste -d '' File1 File2
По умолчанию, paste
соединения строки с вкладками, таким образом, мы должны использовать -d
опция сказать этому использовать пустую строку для присоединения.
Через awk путь:
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
читает всю строку из file2 и содержит в x переменную.print $0x
печатает целую строку от file1 при помощи $0
затем x
который является сохраненной строкой file2.paste
путь состоит в том, чтобы пойти, но ради полноты вот a bash
сфокусированное решение (с небольшой справкой от seq
, и wc
):
for _ in $(seq 1 $(wc -l <f1.txt)); do \
read -u 3 one; read -u 4 two; echo "${one}${two}"; done 3<f1.txt 4<f2.txt
Здесь мы отправляем содержание файлов f1.txt
, и f2.txt
через дескрипторы файлов 3, и 4. read
чтения от соответствующего FDs, и echo
печатает вывод в нужном формате.
Повторение остановится после f1.txt
концы, здесь _
одноразовая переменная.
Лучше, просто bash
, В зависимости от read
статус выхода, когда EOF достигнут с a while
создайте (благодаря steeldriver):
while IFS= read -ru3 one && IFS= read -ru4 two; do echo "${one}${two}"; done 3<f1.txt 4<f2.txt
Пример:
$ cat f1.txt
AAAA
BBBB
CCCC
$ cat f2.txt
XXXX
YYYY
ZZZZ
$ for _ in $(seq 1 $(wc -l <f1.txt)); do read -u 3 one; read -u 4 two; echo "${one}${two}"; done 3<f1.txt 4<f2.txt
AAAAXXXX
BBBBYYYY
CCCCZZZZ
$ while IFS= read -ru3 one && IFS= read -ru4 two; do echo "${one}${two}"; done 3<f1.txt 4<f2.txt
AAAAXXXX
BBBBYYYY
CCCCZZZZ