如何使用do循环读取shell脚本中几个名称相似的文件



我有几个名为scale1.dat、scale2.dat和scale3.dat的文件…直到scale9.dat.

我想在do循环中逐一读取这些文件,并对每个文件进行一些操作(我想将每个scale*.dat文件的第一列写入scale*.txt)。

所以我的问题是,有没有一种方法可以读取类似名称的文件。谢谢

这方面的常规语法是

for file in scale*.dat; do
    awk '{print $1}' "$file" >"${file%.dat}.txt"
done

星号*匹配任何文本或无文本;如果您只想限制为单个非零数字,可以改为for file in scale[1-9].dat

在Bash中,有一个非标准的附加glob语法scale{1..9}.dat,但这只是Bash,因此在#!/bin/sh脚本中不起作用。(你的问题同时有sh和bash,所以不清楚你需要哪一个。你认为bash语法不适合你,这表明你可能需要一个POSIX可移植的解决方案。)此外,bash还有一种叫做扩展globbing的东西,它允许非常精细的模式匹配。另请参阅http://mywiki.wooledge.org/glob

不过,对于这样一个简单的任务,您根本不需要shell。

awk 'FNR==1 { if (f) close (f); f=FILENAME; sub(/.dat/, ".txt", f); }
    { print $1 >f }' scale[1-9]*.dat

(好吧,对于第一个定时器来说,这可能有点吓人。但最基本的一点是,你经常会发现你想要使用的命令可以很好地在多个文件上工作,所以在这种情况下你根本不需要shell循环。)

我不这么认为。无论名称是否相似,您都必须遍历所有文件(可能使用for循环),并使用嵌套循环来遍历行或单词或您计划从这些文件中读取的任何内容。

或者,您可以将文件复制到一个文件中(例如scale-all.dat),然后读取该单个文件。

最新更新