Вы можете попробовать что-то вроде :for i in $(cat list.txt); do touch $i; done
Использование параллелизма GNU в скрипте:
#!/bin/bash
constant=constant
populate_file () {
local const=$1
local file=$(basename -s '.M0.ctl' "$2")
printf '%s\n%s\n%s\n' \
"seqfile = ${file}_p.phy" \
"treefile = ${const}.txt" \
"outfile = ${file}_M0_mlc" > "$2"
}
export -f populate_file
parallel populate_file "$constant" {}.M0.ctl :::: list.txt
Это будет читать строки из list.txt
и выполнять функцию populate_file
для каждой из них параллельно. Функция populate_file
выводит три строки в нужном формате в каждый файл.
При отсутствии параллелизма GNU вы можете использовать цикл чтения while:
#!/bin/bash
constant=constant
populate_file () {
local const=$1
local file=$(basename -s '.M0.ctl' "$2")
printf '%s\n%s\n%s\n' \
"seqfile = ${file}_p.phy" \
"treefile = ${const}.txt" \
"outfile = ${file}_M0_mlc" > "$2"
}
while IFS= read -r file; do
populate_file "$constant" "${file/ /}.M0.ctl"
done < list.txt
Простейший:
xargs touch <List.txt
Волшебство в том, что xargs
берет каждую строку из своего стандартного ввода и добавляет ее в качестве аргумента команды.
Другой способ
tr -s '[:blank:]' '[\n*]' < list.txt |
while IFS= read -r word; do
touch "$word";
done
Этот ответ был предоставлен с предположением, что все «слова» в файле находятся в одной и той же (первой )строке и разделены пробелами.
#!/bin/bash
tr -d '[:blank:]' < list.txt > outputFile.tmp
for i in $(cat outputFile.tmp)
do
echo "seqfile = ${i}_p.phy" >> ${i}_M0.ctl
echo "treefile = constant.txt" >> ${i}_M0.ctl
echo "outfile = ${i}_M0_mlc" >> ${i}_M0.ctl
done
exit 0
Пояснение:
tr -d '[:blank:]' < list.txt > outputFile.tmp
удалит пробелы из списка и скопирует его вoutputFile.tmp
for
считывает все строки из outputFile.tmp
и добавляет в файлы необходимый контекст, создавая их на лету.