当前位置: 首页>>技术教程>>正文


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

,

问题描述

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

john
george
james
stewert

每个名字都在一个单独的行上。

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

我怎样才能在 Bash 中做到这一点?

最佳答案

#1 使用 Bash + touch

while read line; do touch "$line.txt"; done <in
  • while read line; [...]; done <in :这会运行 read 直到 read 本身返回 1 ,当到达文件末尾时会发生这种情况;由于 <in 重定向,read 的输入是从当前工作目录中名为 in 的文件中读取的,而不是从终端读取;

  • touch "$line.txt" :这对 $line.txt 的扩展值运行 touch ,它是 line 后跟 .txt 的内容;如果文件不存在,touch 将创建该文件,如果存在则更新其访问时间;

#2 使用 xargs + touch

xargs -a in -I name touch name.txt
  • -a in :使 xargs 从当前工作目录中名为 in 的文件中读取其输入;

  • -I name :使 xargs 用以下命令中的当前输入行替换 name 的每个出现;

  • touch name :对 name 的替换值运行 touch ;如果文件不存在,它将创建文件,如果存在则更新其访问时间;

% 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

次佳答案

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

xargs touch < file

请注意,如果您的文件名可以包含空格,这将中断。对于这种情况,请改用它:

xargs -I {} touch {} < file

只是为了好玩,这里有一些其他方法(这两种方法都可以处理任意文件名,包括带空格的行):

  • 珀尔

    perl -ne '`touch "$_"`' file
    
  • 错误

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

请注意,在 Linux 和类似系统上,对于绝大多数文件,扩展名是可选的。没有理由向文本文件添加 .txt 扩展名。你可以自由地这样做,但它根本没有区别。因此,如果您无论如何都想要扩展,请使用以下之一:

xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file 

第三种答案

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

第四种答案

Let’s say I have a text file …

让我们说,我有一个答案;)

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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12369.html,未经允许,请勿转载。