use*_*974 1 shell awk filenames wildcards
我在参与的科学实习中对 Inix 终端有一些经验,主要使用一些实用程序,例如grep, awk,sed但是我一直试图弄清楚一件事真的会让我更有效率随着数字运算我必须做。
我有一个脚本run.awk可以对大量的大量文本文件执行一些操作。因为它会获取文件chloride.out,从中提取数据并写入chloride.cm。
无论如何我可以让这个脚本根据shell中的初始通配符短语接收*.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
Run Code Online (Sandbox Code Playgroud)
我创建了一个示例目录,其中包含一些测试文件。
$ touch file{1..4}.out
Run Code Online (Sandbox Code Playgroud)
这导致生成了 4 个文件:
$ ls -1
file1.out
file2.out
file3.out
file4.out
Run Code Online (Sandbox Code Playgroud)
现在我们运行我们的脚本:
$ ./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
Run Code Online (Sandbox Code Playgroud)
在以“running...”开头的每一行之后,我们的脚本可以从这里运行。
假设*.out我们没有使用通配符,而是有一个包含文件名列表的文件,例如:
$ cat filelist.txt
file1.out
file2.out
file3.out
file4.out
Run Code Online (Sandbox Code Playgroud)
我们可以使用我们脚本的这个修改版本,它将使用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
Run Code Online (Sandbox Code Playgroud)
此版本的脚本从文件中读取输入filelist.txt:
done < filelist.txt
Run Code Online (Sandbox Code Playgroud)
然后对于while循环的每一轮,我们使用该read命令从输入文件中读取一行。
while read ifname; do
Run Code Online (Sandbox Code Playgroud)
然后它以与第一个脚本相同的方式执行所有操作,它将在循环遍历文件的每一行时运行awk脚本run.awk。