我有Inix终端从科学的实习我去过的一部分了一定的经验,主要是使用一些实用工具,比如grep
,awk
和sed
,但有一件事我一直在试图找出了一段时间,将真正使我更有效率我必须做数字处理。
我有一个脚本run.awk
,可以对大量海量文本文件进行一些操作。照原样,它将获取文件chloride.out
,从文件中提取数据并写入chloride.cm
。
无论如何,我是否可以使此脚本接受*.out
并*.cm
基于shell中的初始通配符短语编写文件?
我编写的用于处理大量数据的脚本数量(我必须进行一百多次迭代)实在令人讨厌。
理想情况下,我想知道是否可以通过外壳对所有脚本执行此操作。如果无法在Shell中自动执行awk
脚本或执行等效操作,我是否可以至少以与上述类似的方式来自动执行脚本?
您当然可以通过通配符使awk处理多个文件。一个建议是将其保留run.awk
为通用的“函数”,该函数将单个文件放入并生成单个输出文件,然后从另一个脚本调用它,然后该脚本将负责吸收输入和输出文件。
这将是一个Bash脚本,我们可以称之为awk_runner.bash
。
#!/bin/bash
for ifname in *.out; do
ofname=${ifname/.out/.cm}
printf "IN: %s, OUT: %s\n" $ifname $ofname
printf "running run.awk with %s & %s\n\n" $ifname $ofname
run.awk $ifname $ofname
done
我创建了一个示例目录,其中包含一些测试文件。
$ touch file{1..4}.out
这导致制作了4个文件:
$ ls -1
file1.out
file2.out
file3.out
file4.out
现在我们运行脚本:
$ ./awk_runner.bash
IN: file1.out, OUT: file1.cm
running run.awk with file1.out & file1.cm
IN: file2.out, OUT: file2.cm
running run.awk with file2.out & file2.cm
IN: file3.out, OUT: file3.cm
running run.awk with file3.out & file3.cm
IN: file4.out, OUT: file4.cm
running run.awk with file4.out & file4.cm
在每行以“ running ...”开头之后,我们的脚本可以从此处运行。
说而不是使用通配符,而是使用其中*.out
包含文件名列表的文件,例如:
$ cat filelist.txt
file1.out
file2.out
file3.out
file4.out
我们可以使用此脚本的修改版本,该版本将使用while
循环而不是for
循环。现在,我们将该脚本的变体称为awk_file_runner.bash
:
#!/bin/bash
while read ifname; do
ofname=${ifname/.out/.cm}
printf "IN: %s, OUT: %s\n" $ifname $ofname
printf "running run.awk with %s & %s\n\n" $ifname $ofname
run.awk $ifname $ofname
done < filelist.txt
这个版本的脚本从文件中读取输入filelist.txt
:
done < filelist.txt
然后,对于while
循环的每一轮,我们都使用read
命令从输入文件中读取一行。
while read ifname; do
然后执行以同样的方式作为第一个脚本,它将运行所有awk
脚本run.awk
,因为它遍历文件的每一行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句