2011-03-06 246 views
0

我有一個文本文件,它包含了我的計劃控制下的進程列表,以及相關的數據一起工作。從文本文件中刪除一行?

在某些情況下,其中一個進程將完成,因此需要從文件中刪除(因爲它不再受控制)。

這裏是文件內容的樣品(其具有enteries添加的「隨機」):

PID=25729 IDLE=0.200000 BUSY=0.300000 USER=-10.000000 
PID=26416 IDLE=0.100000 BUSY=0.800000 USER=-20.000000 
PID=26522 IDLE=0.400000 BUSY=0.700000 USER=-30.000000 

因此,例如,如果我想刪除表示PID = 26416行如何....我可以這樣做嗎,無需再次寫入文件?

我可以使用外部的unix命令,但我不是很熟悉它們,所以請如果這是你的建議,舉一個例子。

謝謝!

回答

0

的唯一方法是通過複製刪除線下跌超過被刪除的字符之後到來的每個字符。

它更爲高效簡單地重寫文件。

0

我怎麼能這樣做,而無需再次寫入文件?

你不行。文件系統(可能除了更深奧的記錄)不支持插入或刪除。

因此,您必須將行寫入臨時文件,直到您要刪除的行,跳過該行並將其餘行寫入文件。完成後,將臨時文件重命名/複製到原始文件名

1

您可以將文件內容保存在臨時內存中,然後重寫該文件。或者你可以爲每個PID提供一個文件,其中包含相關信息。然後,只需在文件不再運行時將其刪除即可。或者你可以使用數據庫來代替。

1

正如其他人已經指出的那樣,你唯一真正的選擇是重寫文件。

使用「外部UNIX命令」來做到這一點的顯而易見的方法是grep -v "PID=26416"(或者顯然需要刪除任何PID)。

編輯:這可能是值得一提的是如果行都是相同長度(如你在這裏顯示)和順序並不重要,你可以通過複製的最後一行到更有效地刪除一行該空間正在騰空,然後縮短文件以消除最後一行。這將只有工作,如果他們真的都是相同的長度,但(例如,如果你得到了「1」 PID,你需要填充它的長度相同的其他文件中)。

0

它UNIX命令是:

grep -v "PID=26416" myfile > myfile.tmp 

mv myfile.tmp myfile 

grep -v的部分的文件輸出,而不與搜索項的行。

> myfile.tmp部分創建這個輸出一個新的臨時文件。

mv部分將臨時文件重命名爲原始文件。

請注意,我們在這裏重寫文件,而且如果有人在兩個命令之間寫入文件,我們可能會丟失數據。

0

您可以使用SED:

sed -i.bak -e '/PID=26416/d' test

-i是就地編輯。它還會創建一個帶有新擴展名的備份文件.bak

-e用於指定模式。/d表示應該刪除與模式匹配的所有行。

test是文件名

0

你爲什麼要在文本文件中維護這些?這不是這種任務的最佳模式。但是,如果你堅持使用它......如果這些行保證都是相同的長度(這與示例中的方式相同),並且如果文件中行的順序無關緊要,那麼你可以寫上對已死亡,然後通過與(F)一行縮短文件截斷(工藝線的最後一行)調用,如果你是一個POSIX系統上:見喬納森·萊弗勒在How to truncate a file in C?

答案但請注意netrom的答案,它提供了三種不同的更好的方式來維護這些信息。另外,如果你堅持使用一個文本文件(最好每次從頭開始寫數據結構,按照netrom的第一個建議進行維護),並且要確保該文件始終格式良好,然後編寫新數據放入同一設備上的臨時文件(放在同一目錄中最簡單),然後執行一次rename()調用,這是一次原子操作。