Для этого вы можете использоватьcomm
(напротив diff
).
comm -1 -2 1.txt 2.txt >3.txt
-1
подавляет строки первого столбца (, которые находятся в 1.txt
, но не2.txt
)
-2
подавляет строки второго столбца (, которые есть в 2.txt
, но не1.txt
)
остается только третий столбец, который будет общими строками
В Bash вы можете использовать подстановку процессов, чтобы сначала отсортировать файлы:
comm -1 -2 <(sort 1.txt) <(sort 2.txt) > 3.txt
Что-то вроде этого может быть тем, что вам нужно:
#!/bin/bash
filelist=""
for i in {1..5}; do
filelist+="file${i}.pdf "
done
pkftk ${filelist} cat output xyz.pdf
Цикл начинается с 1..k и создает строку, содержащую «file1.pdf... filek.pdf». После завершения цикла он запускается pdftk
, передавая список файлов, а также «cat output xyz.pdf», который вы указали в своем вопросе.
Если вам нужен один лайнер -, вы можете сократить вышеизложенное до (здесь, предполагаяk=5
):
pdftk $(for i in {1..5}; do printf "%s " file$i.pdf; done) cat output.xyz.pdf
Логика такая же, но я использую подстановку команд для запуска цикла for
; $(...)
заменяется выводом ...
(, в данном случае списком файлов ). Я использую printf
вместо echo
, чтобы избежать новой строки.
Если вы используете bash, как указано в вашем вопросительном теге, нет необходимости в цикле :вы должны иметь возможность использовать расширение фигурной скобки .
Пр. для k = 32
pdftk file{1..32}.pdf cat output xyz.pdf
Если количество файлов очень велико, этот подход может стать ограниченнымARG_MAX
(и привести к ошибке "слишком длинный список аргументов" ).