Допустим, у меня есть текстовый файл, как:
john
george
james
stewert
с каждым именем на отдельной строке.
Я хочу прочитать строки этого текстового файла и создать текстовый файл для каждого имени, например: john.txt
и george.txt
т. Д.
Как я могу сделать это в Bash?
command-line
bash
levato
источник
источник
Ответы:
# 1 Использование Bash +
touch
:while read line; [...]; done <in
: Это выполняетсяread
до тех пор, покаread
сам не вернется1
, что происходит, когда достигается конец файла; вход дляread
считывается из файла с именемin
в текущем рабочем каталоге, а не из терминала из-за<in
перенаправления;touch "$line.txt"
: Это работаетtouch
на расширенном значении$line.txt
, которое является содержимым, заline
которым следует.txt
;touch
создаст файл, если он не существует, и обновит время доступа, если оно существует;# 2 Использование
xargs
+touch
:-a in
: делаетxargs
чтение входных данных из файла с именемin
в текущем рабочем каталоге;-I name
: делаетxargs
замену каждого вхожденияname
на текущую строку ввода в следующей команде;touch name
: Работаетtouch
на замененном значенииname
; он создаст файл, если он не существует, и обновит время доступа, если оно существует;источник
read line
самом деле будет читать строку? @kos<in
afterdone
делаетread
вwhile
условии цикла чтение и сохранение одной строки изin
inline
на каждой итерации; таким образом,touch "$line.txt"
внутри цикла будет расширен до строки чтения с.txt
в конце.while read line; do touch "$line.txt"; done <in
один будет делать работу? Где находится исходный файл?read
работает. Смhelp read
.В этом конкретном случае, когда у вас есть только одно слово в строке, вы также можете сделать:
Обратите внимание, что это сломается, если ваши имена файлов могут содержать пробелы. Для таких случаев используйте это вместо:
Просто для удовольствия, вот несколько других подходов (оба из которых могут обрабатывать произвольные имена файлов, включая строки с пробелами):
Perl
Awk
Обратите внимание, что в Linux и подобных системах расширение является необязательным для подавляющего большинства файлов. Нет причин добавлять
.txt
расширение к текстовому файлу. Вы можете сделать это, но это не имеет никакого значения. Так что, если вы хотите расширение в любом случае, используйте один из:источник
AWK также подходит для этой задачи:
Другой способ
tee
. Обратите внимание, что этот подход будет нарушен, если строка содержит более одной строки в списке файлов.Кроме того,
</dev/null tee $(cat filelist)
может быть сделано, если вы хотите избежать трубопроводаcp /dev/null
подход (как я демонстрирую, это работает с именами файлов, которые содержат пробелы):источник
echo "" | tee file1 file2 file2
. Но он ломается, если имена файлов содержат пробелы.Допустим, у меня есть ответ ;)
Водонепроницаем также с пробелами и с суффиксом =)
источник