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

时间:2015-03-25 13:11:40

标签: linux bash sh

我有几个名为scale1.dat,scale2.dat scale3.dat ...的文件,最高可达scale9.dat。

我想在do循环中逐个读取这些文件,并且每个文件都要进行一些操作(我想写每个缩放* .dat文件的第一列来缩放* .txt)。

所以我的问题是,有没有办法读取名称相似的文件。感谢。

2 个答案:

答案 0 :(得分:0)

这个的常规语法是

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脚本中不起作用。 (您的问题同时包含,因此您不清楚需要哪些。您对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循环。)

答案 1 :(得分:-1)

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

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