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

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

john
george
james
stewert

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

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

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

21
задан 22 November 2015 в 21:41

4 ответа

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
18
ответ дан 23 November 2015 в 07:41
  • 1
    Спасибо! Я установил libc6-x32, но это - то же! dpkg -l package libc6-x32:i386 ... ii libc6-x32:i386 2.24-3ubuntu i386 GNU C Library: X32 ABI Shared lib, но та же проблема: isa@isa-mini-PC:~$ ldd /home/isa/Downloads/temp/Linux/Fusion/Fusion not a dynamic executable – Isag 14 February 2017 в 16:08

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

xargs touch < file

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

xargs -I {} touch {} < file

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

  • Perl

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

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

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

xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file 
18
ответ дан 23 November 2015 в 07:41
  • 1
    Попробуйте apt-get install gcc-multilib... зафиксировал его для меня. – Erik Aronesty 7 August 2018 в 08:56

Скажем, у меня есть текстовый файл …

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

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

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

7
ответ дан 23 November 2015 в 07:41
  • 1
    работало спасибо, добавляя к черному списку. Но как насчет лучше фиксируют использование обновленного ядра или обновления во встроенном микропрограммном обеспечении для Linux какая-либо идея? – user1993000 13 February 2017 в 03:50

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
7
ответ дан 23 November 2015 в 07:41
  • 1
    Что-то [приблизительно 110], как USB был сделан, больше похожи на него. –  13 February 2017 в 17:25

Другие вопросы по тегам:

Похожие вопросы: