2012-03-27 74 views
22

考慮在文件中的科學數據的文本文件,例如:如何刪除文本文件中的每個第X行?

5.787037037037037063e-02 2.048402977658663748e-01 
1.157407407407407413e-01 4.021264347118673754e-01 
1.736111111111111049e-01 5.782032163406526371e-01 

我怎樣才能輕鬆地刪除,例如,每秒鐘線,或每9個10行?例如可能與一個bash腳本?

背景:文件非常大,但我需要的數據少得多。請注意,我正在使用Ubuntu/Linux。

+0

你確定你想點採樣這樣的數據?進行下采樣可能會更好,其中來自N行組的數據以某種適當的方式進行平均。點採樣可能會導致混疊問題。 – Kaz 2012-03-27 20:07:18

+0

http://unix.stackexchange。com/questions/168004/delete-every-n-line-in-shell – 2015-07-12 10:32:20

回答

53

這是很容易使用awk來完成。

刪除每隔一行:

awk 'NR % 2 == 0' file > newfile 

刪除每第10行:

awk 'NR % 10 != 0' file > newfile 

在AWK的NR變量是行號。 awk之外的任何內容都是有條件的,並且默認操作是打印。

+0

從來沒有聽說過awk之前。一定會檢查出來吧!謝謝! – Ingo 2012-03-27 18:52:10

+0

Awk非常適合在shell腳本中處理文本。它也可以做浮點數學,這是bash無法做到的。絕對值得花時間學習shell編程。 – jordanm 2012-03-27 18:56:58

+1

第一條命令使用均勻ids保留行,但不會將其刪除。如果你想刪除它,使用awk'NR%2!= 0'file> newfile。 – Olga 2013-12-18 17:18:32

2

嘗試類似:

awk 'NR%3==0{print $0}' file 

這將在三個打印一行。或者:

awk 'NR%10<9{print $0}' file 

將打印十行中的十行。

+1

打印是默認操作,所以不需要'print $ 0'。 – jordanm 2012-03-27 18:08:18

+0

我知道。看起來對我來說太奇怪了。 (我不是經驗豐富的awk用戶) – Mat 2012-03-27 18:11:52

+0

NR%10永遠不會超過9 ... – 123 2017-12-01 09:02:55

2

你可以用sed來做,

sed -n -e 'p;N;d;' file # print every other line, starting with line 1 

如果你有GNU sed的它很容易

sed -n -e '0~10p' file # print every 10th line 
sed -n -e '1~2p' file # print every other line starting with line 1 
sed -n -e '0~2p' file # print every other line starting with line 2 
0

您可以使用awk和shell腳本。 AWK是很困難的,但...

這將刪除特定行你告訴它:

nawk -f awkfile.awk [filename] 

awkfile.awk contents 

BEGIN { 
if (!lines) lines="3 4 7 8" 
n=split(lines, lA, FS) 
for(i=1;i<=n;i++) 
linesA[lA[i]] 
} 
!(FNR in linesA) 

而且我不記得,如果VIM自帶的標準的Ubuntu與否。如果沒有得到它。

然後打開該文件用vim VIM [文件名]

然後鍵入

:%!awk NR\%2 or :%!awk NR\%2 

這將刪除所有其他行。只需將2改爲另一個不同頻率的整數。

6

perl怎麼樣?

perl -n -e '$.%10==0&&print'  # print every 10th line 
+0

他希望每10行刪除一行,而不是保留每10行。輕鬆更改您的代碼,!=而不是==。 – jordanm 2012-03-27 18:52:52

+2

編號他說:「我怎樣才能輕鬆**刪除**,例如,每第二行,或**文件中每9行10行**」,刪除每10行中的9行意味着每隔10。正如你所說,一旦解決方案發布,很容易適應,所以我沒有糾正過糾正其他發佈相同錯誤的海報。 – Sorpigal 2012-03-27 18:55:20

+0

重讀這個問題後,我相信你的解釋是正確的。 – jordanm 2012-03-27 18:58:35

2

這可能爲你工作(GNU SED):

seq 10 | sed '0~2d' # delete every 2nd line 
1 
3 
5 
7 
9 
seq 100 | sed '0~10!d' # delete 9 out of 10 lines 
10 
20 
30 
40 
50 
60 
70 
80 
90 
100 
相關問題