2010-04-15 47 views
0

我有這個文件「file.txt」,我想分割成許多小文件。 這一塊它:使用RegExp的匹配值來命名輸出文件

0 id:2293 7:0.78235 12:0.69205 17:0.79421 21:0.77818 ..
4 id:2293 7:0.78235 8:0.97904 12:0.69205 17:0.31709 ..
1 id:2294 7:0.78235 8:0.90994 17:0.49058 21:0.59326 ..

的文件的每一行都有一個id字段,它看起來像「ID:1」用於屬於ID 1 每個ID文件中的一條線,我喜歡創建一個名爲id id .txt的文件,並將屬於該id的所有行放在該文件中。 我的蠻力bash腳本解決方案如下所示。

count=1
while [ $count -lt 19945 ] do
cat file.txt | grep "id:$count " >> ./sets/id$count.txt
count='expr $count + 1'
done

現在,這是非常低效的,因爲我已經通過文件約20.000倍務必閱讀。 有沒有辦法通過文件只進行一次相同的操作? - 我可能要求的是一種使用與正則表達式相匹配的值來命名相關輸出文件的方法。

+0

顯示您的文件看起來像下一次 – ghostdog74 2010-04-15 08:20:24

回答

2
$ cat file 
0 id:2293 7:0.78235 12:0.69205 17:0.79421 21:0.77818 .. 
4 id:2293 7:0.78235 8:0.97904 12:0.69205 17:0.31709 .. 
1 id:2294 7:0.78235 8:0.90994 17:0.49058 21:0.59326 .. 

$ awk -F"[: ]" '{print $0 > "id_"$3".txt"}' file 

$ more id_2293.txt 
0 id:2293 7:0.78235 12:0.69205 17:0.79421 21:0.77818 .. 
4 id:2293 7:0.78235 8:0.97904 12:0.69205 17:0.31709 .. 

$ more id_2294.txt 
1 id:2294 7:0.78235 8:0.90994 17:0.49058 21:0.59326 .. 
+0

感謝您與提示文件格式。我剛剛添加了該文件的一個片段。 – user306708 2010-04-15 08:40:24

+0

耶!這個命令的作品宏偉。謝謝。 – user306708 2010-04-15 09:53:52

1

的解決方案試試這個AWK腳本:

#!/usr/bin/awk -f 
{ 
    if (match($0, /id:([0-9]+)/, a)) 
     print $0 >> "file" a[1] ".txt"; 
} 
+0

嘗試過。得到: awk:./try.awk:第3行:語法錯誤在或接近, – user306708 2010-04-15 09:21:46