2016-05-15 73 views
0

我有一個包含300個文件的文件夾。如果$ 2 < = 25,我想從文件中刪除行。如何直接從文件中刪除行(就地編輯)?我的代碼如下所示。根據條件刪除整行

awk '{ for (i=1; i<=NF; i++) { if ($2 <= 25) next } print }' < * 

ads 54.5 18 15.3 39.2 
bdy 18.5 21 1.5  17.0 
cst 36.8 22 27.7 9.1 
hst 40.2 25 16.2 24.0 
ads 18.9 41 5.0  13.2 
bdy 20.5 45 67.0 19.0 
+0

請參見:[刪除所有第1列具有特定數字條目的行](http://stackoverflow.com/questions/22697636/delete-all-lines-where-column-1-has-specific-numeric-entries)和[awk保存修改inplace](http://stackoverflow.com/questions/16529716/awk-save-modifications-inplace) – Cyrus

+1

我強烈建議你在嘗試之前閱讀由Arnold Robbins編寫的Effective Awk編程第4版任何更多的文本操作,因爲您對awk語法看起來很困惑(例如,循環遍歷每次重複測試$ 2的所有字段)和調用(例如,試圖從文件列表中使用輸入重定向,並希望以某種方式更改awk不知道的文件中的值是否存在該重定向的禮貌)。 –

回答

2

你的腳本做得太多了。將乾淨的解決方案,我的腦海裏,反轉條件:

awk '{ if ($2 > 25) print }' 

甚至:

awk '$2 > 25' 

如果你不想反轉的條件,則:

awk '{ if ($2 <= 25) next; print }' 

有不需要遍歷所有的字段。


甚至沒有GNU awk支持 '原位' 文件修改。您必須將結果寫入臨時文件,然後將臨時文件複製或移回原始文件。 (複製保存硬鏈接和權限;此舉打破了聯繫,並可以修改所有者和權限,你需要決定是否這是一個問題。)

感謝Ed Morton的指出了GNU AWK 4.x中是否有一個機構「原位」編輯文件,部分原因是因爲他競選加入。

命令行幫助不會告訴你GNU Awk 4.x支持文件的原地修​​改,但是如果你找到了手冊的正確部分(Extension sample: inplace-從我的角度來看這是錯誤的;不僅僅是一個示例,因爲它是一個分佈式擴展),那麼你可以發現有一個擴展使GNU Awk覆蓋了在其命令行中指定的常規文件。

gawk -i inplace '{ if ($2 > 25) print }' file1 … 

甚至:

gawk -i inplace '$2 > 25' file1 … 

注意,實驗表明,它是很高興來修改原位只讀文件。這與sed(包括GNU和BSD(Mac OS X)子種)一致;他們也會在沒有警告的情況下就地修改只讀文件 - 並保留文件的權限,但會破壞任何硬鏈接。


您的腳本使用awk '…' < *;這是忽略目錄中第一個文件的獨特方式,除非它是目錄中的唯一文件(它用於標準輸入,但如果目錄中有多個文件,標準輸入將被忽略)。您只需要使用*,而不是< *