提取文件名的一部分的Shell脚本

10
在bash中,我想要提取许多文件名的一部分并将输出保存到另一个文件中。
这些文件的格式为coffee_{我想要的一些数字}.freqdist。
#!/bin/sh
for f in $(find . -name 'coffee*.freqdist)

这段代码将会找到所有的coffee_{一些数字}.freqdist文件。现在,我该如何创建一个只包含{一些数字}的数组并将其写入文件呢?

我知道要想将内容写入文件,需要在行末添加以下代码。

  > log.txt

我只是缺少如何筛选文件名列表的中间部分。


1
你可能想看一下'sed'命令。 - arkascha
实际上不是这样的。我正在为一个涉及比较不同地点推文的临床研究项目查询Twitter。Twitter在搜索40k个邮政编码时卡住了大约5%。但是,由于我将zipcodes作为Python字典加载(因此无序),所以我只能通过已搜索的zipcodes来标记输出文件。我认为这是学习一些关于shell脚本而不是用Python完成它的好理由。 - mac389
实际上没有 = 对Piort的作业评论做出的回应。 - mac389
3个回答

17

你可以在 bash 中原生地完成它,如下所示:

filename=coffee_1234.freqdist
tmp=${filename#*_}
num=${tmp%.*}
echo "$num"

这是一个纯Bash解决方案。没有使用外部命令(如sed),因此速度更快。

使用以下命令将这些数字追加到文件中:

echo "$num" >> file

在你开始循环之前,你需要删除/清除该文件。


7
如果只是想将数字写入文件,您不需要使用find命令:
ls coffee*.freqdist
coffee112.freqdist  coffee12.freqdist  coffee234.freqdist

以下内容应该能够完成操作,然后可以将其重定向到文件中:
$ ls coffee*.freqdist | sed 's/coffee\(.*\)\.freqdist/\1/'
112
12
234

大师。


我本意也是要去掉前导下划线的,所以应该这样写:'s/coffee_(.*).freqdist/\1/'。 - mac389

1
以前的回答已经指出了一些必要的技术。这个答案以一种简单的方式组织了流程,可能也适用于其他工作。(如果你的sed不支持‘;’作为分隔符,请用‘|sed’替换‘;’。)
$ ls */c*; ls c*
 fee/coffee_2343.freqdist
 coffee_18z8.x.freqdist  coffee_512.freqdist  coffee_707.freqdist
$ find . -name 'coffee*.freqdist' | sed 's/.*coffee_//; s/[.].*//' > outfile
$ cat outfile 
 512
 18z8
 2343
 707

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接