如何在终端中使用部分文件名?

时间:2014-08-26 15:35:30

标签: unix sed terminal

我在OS 10.X上使用终端。我有一些格式的数据文件:

mbh5.0_mrg4.54545454545_period0.000722172513951.params.dat
mbh5.0_mrg4.54545454545_period0.00077271543854.params.dat
mbh5.0_mrg4.59090909091_period-0.000355232058085.params.dat
mbh5.0_mrg4.59090909091_period-0.000402015664015.params.dat

我知道在mbh和mrg之后会有一些类似数字的文件,但我不会提前知道这些数字是多少,或者有多少类似编号的数字。我的目标是将mbh和mrg之后具有相似数字的所有文件中的所有数据捕获到一个数据文件中。所以从上面我想做点什么......

cat mbh5.0_mrg4.54545454545*dat > mbh5.0_mrg4.54545454545.dat
cat mbh5.0_mrg4.5909090909*dat > mbh5.0_mrg4.5909090909.dat

我想自动化这个过程,因为会有很多这样的文件。 最好的方法是什么?我一直在研究sed,但我还没有解决方案。

2 个答案:

答案 0 :(得分:3)

for file in *.params.dat; do
    prefix=${file%_*}
    cat "$file" >> "$prefix.dat"
done

此部分${file%_*}从$ file末尾删除 last 下划线和后续文本,并将结果保存在prefix变量中。 (参考:http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

答案 1 :(得分:0)

我不是100%清楚你想要在这里实现什么,但是如果你想在“mbh5.0_mrg4”之后将文件聚合到一个具有相同数字的文件中。然后你可以做到以下几点。

ls -l mbh5.0_mrg4 * | awk'{print“cat”$ 9“> mbh5.0_mrg4。” substr($ 9,12,11)“。dat”}'| /斌/庆典

“ls -s”列出文件,“awk”从ls的结果中取出第9列。使用一些字符串连接,结果将传递给/ bin / bash以执行。

这是一个linux bash脚本,所以假设你有/ bind / bash,我不是100%熟悉OS X.这个脚本还假设你分组的数字总是在文件名中的同一个地方。我认为您可以将/ bin / bash更改为几乎所有已安装的shell。