从文本文件中读取行并为每行的每个名称创建一个文本文件

从文本文件中读取行并为每行的每个名称创建一个文本文件

假设我有一个文本文件,如下:

john
george
james
stewert

每个名字占一行。

我想读取这个文本文件的行并为每个名称创建一个文本文件,例如:john.txtgeorge.txt等等。

我如何在 Bash 中执行此操作?

答案1

在这种特殊情况下,每行只有一个单词,您也可以执行以下操作:

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 

答案2

#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后跟.txttouch如果不存在则创建该文件,如果存在则更新其访问时间;

#2 使用xargs+ touch

xargs -a in -I name touch name.txt
  • -a in:从当前工作目录中xargs命名的文件中读取其输入;in
  • -I name:用以下命令中的当前输入行xargs替换每次出现的;name
  • touch nametouch:在替换的值上运行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

答案3

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

答案4

假设我有一个文本文件……

假设我有一个答案;)

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

带空格和后缀也能防水=)

相关内容