我有几个名为scale1.dat,scale2.dat scale3.dat ...到scale9.dat的文件。

我想逐个循环读取这些文件,并希望对每个文件进行一些操作(我想将每个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脚本中将不起作用。 (您的问题同时包含shbash,因此您不清楚该使用哪个。您对Bash语法不起作用的评论表明您可能需要POSIX可移植的解决方案。)此外,Bash具有称为扩展全局性的东西。 ,它允许进行非常精细的模式匹配。另见http://mywiki.wooledge.org/glob

对于这样的简单任务,您根本不需要外壳。

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


(好吧,这对初学者来说可能有点吓人。但是基本要点是,您经常会发现想要使用的命令可以在多个文件上愉快地工作,因此您根本不需要shell循环案例。)

关于linux - 如何使用do循环在shell脚本中读取多个具有相似名称的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29256653/

10-15 12:16
查看更多