2012-07-12 41 views
3

我有一個C++程序,它生成許多數據文件,每個文件包含三列。現在,在每個這些數據文件中,可能會有一些異常條目,其中第三列將具有-nan。如何編寫腳本以便打開這些數據文件中的每一個,並找到第三列中的所有行並刪除所有這些行? 是否有可能在bash或python中編寫一個可以執行此操作的腳本? 例子:編輯許多文本文件的腳本

100 0.1 15.8334 
100 0.2 16.7895 
100 0.3  -nan 
100 0.4 15.8543 
100 0.5  -nan 

在該文件中,我想第3和第5行被刪除,這樣我的文件看起來像

100 0.1 15.8334 
100 0.2 16.7895 
100 0.4 15.8543 
+3

你能否提供了兩個樣本數據的行? – 2012-07-12 13:11:08

+0

100 0.1 15.8334 100 0.2 16.7895 100 0.3 -NAN 100 0.4 15.8543 100 0.5 -NAN 在該文件中,我想第3和第5行被刪除,這樣我的文件看起來像 100 0.1 15.8334 100 0.2 16.7895 100 0.4 15.8543 – lovespeed 2012-07-12 13:12:16

+0

@SthitadhiRoy在帖子中。確保你縮進四個空格。實際的空格(tab/spaces)很重要 – sehe 2012-07-12 13:13:31

回答

2
sed -i -e '/-nan/d' datafile.txt 

對多個文件進行操作,可以代替「 datafile.txt」與匹配的所有文件,或者使用一個for循環

for file in data1.txt data2.txt data3.txt; do 
    sed -i -e '/-nan/d' $file 
done 

或者可能find命令水珠:

find . -name "data*.txt" -exec sed -i -e '/-nan/d' {} + 
+0

這將創建新文件'e'加入到它們的文件名中。但是我想保持文件名相同,我當然可以刪除舊文件並重命名新文件,但這可能需要很長時間,因爲文件數量爲數千。 – lovespeed 2012-07-12 13:40:24

+0

我的歉意;我沒有檢查-i和-e會如何相互作用。我正在使用「sed'/ -nan/d'文件」,但-e顯然是必需的,如果你試圖指定多個文件進行編輯。 – chepner 2012-07-12 13:59:10

3

喜歡的東西(在bash):

for file in files ;do 
    grep -v -- -nan file > file.$$ && mv file.$$ file 
done 

雖然應該在代碼中清理它。

1

這是基本的機制:

with open('yourfile.txt') as fin, open('yourfile_output.txt', 'w') as fout: 
    for line in fin: 
     try: 
      c1, c2, c3 = line.split() 
      if c3 != '-nan': 
       fout.write(line) 
     except ValueError as e: 
      pass # Handle cases where number of cols != 3 

然後把在功能和使用glob.iglob到reutrn匹配的文件名和循環列表...

另一種可能的選擇只是爲了完整性:

from math import isnan 

with open('yourfile.txt') as fin, open('yourfile_output.txt', 'w') as fout: 
    for line in fin: 
     try: 
      c1, c2, c3 = map(float, line.split()) 
      if not isnan(c3): 
       fout.write(line) 
     except ValueError as e: 
      pass # Handle cases where number of cols != 3 
+1

這應該是'open'您的文件.txt')作爲fin,打開('yourfile_output.txt','w')爲fout:'。 – MRAB 2012-07-12 13:18:17

+0

@Levon Okay - 調整到必須完全等於3,它符合3列的OP聲明 – 2012-07-12 13:18:24

+0

@MRAB謝謝 - 不確定額外的'with'是如何到達那裏的,並且'w'很好 - 大腦顯然沒有被踢進今天適當裝備 – 2012-07-12 13:21:00