【问题标题】:Running a command for each line of a text file (Bash)为文本文件的每一行运行一个命令 (Bash)
【发布时间】:2015-04-24 00:56:35
【问题描述】:

我正在开发一个执行以下操作的程序:

读取文件夹 X 中的 270 文件并调用另一个程序以使用该文件的内容运行命令。例如:

$ cat X/1.txt
AAAA
BBBB
CCCC

该程序应该读取该文本(其中有 270 个),并且在循环中它应该这样做:

$python file.py AAAA; 

然后

python file.py BBBB; 

然后

python file.py CCCC. 

然后移动到下一个文件,比如 22.txt(这些文件不是数字的,所以计数器不会有太大帮助)。

我尝试了以下方法:

function text(){
for i in $(ls Domains/);
while read line;
do
        $line
        f= done < Domains/$i.txt
        python file.py $f
}

text;

谢谢各位!

【问题讨论】:

  • 不是那样(忽略这条评论)
  • 似乎我在这里看到的每一个带有 bash 标记的问题都需要有人指出parsing LS 的危险。请阅读链接,不要做你正在做的事情。并阅读find 及其-exec 选项,这就是您想要使用的方向。

标签: bash shell scripting


【解决方案1】:

这就是xargs 派上用场的地方:连接所有文件并将其通过管道传输到 xargs 中,从而将每一行逐一提供给 python 程序。

cat * | xargs -L1 python file.py

【讨论】:

  • 根据我在网上阅读的内容,建议不要将 cat 用于此类事情.. 会使事情变得混乱.. 但为 xargs +1!
  • @user3610137:相反,这是cat 的绝佳使用。相反,您不应该这样做:for i in $(ls Domains/); 当文件的名称中包含空格或全局字符时,这将失败。 for i in *; 是首选。但是,如果您不在乎一行来自哪个文件,cat * | 是简单可靠的,除非您的目录中有数以万计的文件。
【解决方案2】:

这应该可行:

function text(){
for i in $(ls Domains/)
do
while read line;
do
python file.py $line
done < Domains/$i.txt   
done     
}

【讨论】:

  • 是否可以将每个文件的输出转储到它自己的文本文件中?
  • 是的,首先将所有输出收集到一个变量或一个单独的文件中,然后在文本文件使用完毕后(在while循环之后)将其转储到文本文件中。
  • 怎么样?我尝试添加 done $i-DONE.txt 但这不起作用。
  • 这不是你获得输出的方式。你的输出将由 python file.py $line 生成,将它们重定向到另一个文件。
  • 我正在尝试运行 python 文件并将其输出放在它自己的文件中。所以运行每个 .txt 文件的 python file.py $line 并将输出转储到 $i-OUTPUT .txt
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 2014-05-11
  • 2018-05-02
  • 2013-02-04
  • 2012-04-07
  • 2018-04-03
  • 1970-01-01
相关资源
最近更新 更多