Чтение строк из текстового файла и создание текстового файла для каждого имени в каждой строке

21

Предположим, у меня есть текстовый файл, например:

john
george
james
stewert

с любым именем в отдельной строке.

Я хочу прочитать строки этого текстового файла и создать текстовый файл для каждого имени, например: john.txt , george.txt и т. д.

Как я могу сделать это в Bash?

    
задан levato 22.11.2015 в 15:34
источник

4 ответа

17

# 1 Использование Bash + touch :

while read line; do touch "$line.txt"; done <in
  • while read line; [...]; done <in : выполняется read до тех пор, пока read не вернет 1 , что происходит, когда достигнут конец файла; вход для read считывается из файла с именем in в текущем рабочем каталоге, а не из терминала из-за перенаправления <in ;
  • touch "$line.txt" : для touch выполняется $line.txt , то есть содержание line , за которым следует .txt ; touch создаст файл, если он не существует, и обновит его время доступа, если оно существует;

# 2 Использование xargs + touch :

xargs -a in -I name touch name.txt
  • -a in : делает xargs считывает свой вход из файла с именем in в текущем рабочем каталоге;
  • -I name : делает xargs заменяет каждое появление name текущей строкой ввода в следующей команде:
  • touch name : Запускает touch на замененное значение name ; он создаст файл, если он не существует, и обновит его время доступа, если оно существует;
% ls
in
% cat in
john
george
james
stewert
% while read line; do touch "$line.txt"; done <in
% ls
george.txt  in  james.txt  john.txt  stewert.txt
% rm *.txt
% xargs -a in -I name touch name.txt
% ls
george.txt  in  james.txt  john.txt  stewert.txt
    
ответ дан kos 22.11.2015 в 15:49
источник
18

В этом конкретном случае, когда у вас есть только одно слово в строке, вы также можете сделать:

xargs touch < file

Обратите внимание, что это сломается, если ваши имена файлов могут содержать пробелы. Для таких случаев используйте вместо этого:

xargs -I {} touch {} < file

Просто для удовольствия, вот пара других подходов (оба из которых могут обрабатывать произвольные имена файлов, включая строки с пробелами):

  • Perl

    perl -ne ''touch "$_"'' file
    
  • Awk

    awk '{printf "" > $0}' file 
    

Обратите внимание, что в Linux и подобных системах расширение является необязательным для подавляющего большинства файлов. Нет причин добавлять расширение .txt в текстовый файл. Вы свободны в этом, но это не имеет никакого значения. Итак, если вы хотите расширение в любом случае, используйте один из:

xargs -I {} touch {}.txt < file
perl -ne ''touch "$_.txt"'' file
awk '{printf "" > $0".txt"}' file 
    
ответ дан terdon 22.11.2015 в 17:58
7

AWK также подходит для этой задачи:

testerdir:$ awk '{system("touch "$0)}' filelist

testerdir:$ ls
filelist  george  james  john  stewert

testerdir:$ awk '{system("touch "$0".txt")}' filelist                          

testerdir:$ ls
filelist  george.txt  james.txt  john.txt  stewert.txt
george    james       john       stewert

Другой способ: tee . Обратите внимание, что этот подход будет нарушен, если строка содержит более одной строки в списке файлов.

testerdir:$ echo "" | tee $(cat filelist)


testerdir:$ ls
filelist  george  james  john  stewert

В качестве альтернативы, </dev/null tee $(cat filelist) также может быть выполнено, если вы хотите избежать трубопровода

cp /dev/null (поскольку я демонстрирую, что это работает с именами файлов, которые содержат пробелы):

testerdir:$ cat filelist | xargs -I {}  cp /dev/null  "{}"                     

testerdir:$ ls
filelist  FILE WITH SPACES  george  james  john  stewert

testerdir:$ ls FILE\ WITH\ SPACES                                              
FILE WITH SPACES
    
ответ дан Sergiy Kolodyazhnyy 22.11.2015 в 18:06
7

Let's say I have a text file …

Скажем, у меня есть ответ ;)

awk '{system("touch \""$0".txt\"")}' file

Водонепроницаемость также с пробелами и суффиксом =)

    
ответ дан A.B. 22.11.2015 в 18:04