我有几个名为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
脚本中将不起作用。 (您的问题同时包含sh和bash,因此您不清楚该使用哪个。您对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/