2012-09-25 119 views
4

在bash中,我想提取許多文件名的一部分並將輸出保存到另一個文件。提取文件名shell腳本的一部分

這些文件被格式化爲coffee_ {我想要的一些數字} .freqdist。

#!/bin/sh 
for f in $(find . -name 'coffee*.freqdist) 

該代碼將查找所有coffee_ {有些數字我想要} .freqdist文件。現在,我如何創建一個包含{我想要的一些數字}的數組並將其寫入文件?

我知道要寫入文件將會結束以下行。

> log.txt 

雖然如何過濾文件名列表,但我錯過了中間部分。

+0

是作業嗎? :P –

+1

您可能想看看'sed'命令。 – arkascha

+0

其實沒有。我正在查詢Twitter的臨牀研究項目,其中涉及比較來自不同地點的推文。 Twitter通過40k郵政編碼搜索大約5%。但是,由於我將Python代碼作爲Python中的字典加載(因此無序),因此我只有通過zipcode標記的輸出文件才能確定我已經搜索過哪些郵政編碼。我認爲這是學習shell腳本而不是用Python做的一個很好的理由。 – mac389

回答

9

您可以在本地bash如下做到這一點:

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

這是一個純bash的解決方案。不涉及外部命令(如sed),因此速度更快。

附加這些號碼使用文件:

echo "$num" >> file 

(你將需要刪除/清除文件您啓動循環之前。)

6

如果目的僅僅是數字寫入一個文件,你不需要找命令:

ls coffee*.freqdist 
coffee112.freqdist coffee12.freqdist coffee234.freqdist 

下面應該這樣做,然後可以重新定向到一個文件:

$ ls coffee*.freqdist | sed 's/coffee\(.*\)\.freqdist/\1/' 
112 
12 
234 

Guru。

+0

我的意思是把下劃線取出來:'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 
+0

感謝您的延伸。我總是感激學習。 – mac389