2017-01-01 57 views
1

刪除具有特定數值的行我有大約100萬行這樣一個非常龐大的文件:在現場

4001 168991 11191 74554 6
8 145 25 101 83 51 124 43 
2985 136287 4424 62832 50788 26847 89132 19184 
3 129 14 101 88 61 83 32 1 14  10 12 7 13 4 
6136 158525 14054 100072 134506 78254 146543 41638 
1 40 4 14 19 10 35 4 
2981 112734 7708 54280 50701 33795 75774 19046 
7762 339477 26805 148550 155464 119060 254938 59592 
1 22 2 12 10 6 17 2 
6 136 16 118 184 85 112 56 1 28 1 5 18 25 40 2 
1 26 2 19 28 6 18 3 
4071 122584 14031 69911 75930 52394 89733 30088 
1 9 1 3 4 3 11 2 14 314 32 206 253 105 284 66 

我想刪除那些在第二列中的值小於100行。

如何用sed做到這一點?

回答

6

我會用awk來做到這一點。例如:

awk ' $2 >= 100 ' file.txt 

這樣只會從具有列$2大於100

+1

@EdMorton權,固定。 – Derk

1

用下面的辦法file.txt的顯示的每一行:

sed '/^\w+\s+([0-9]{1,2}|[0][0-9]+)\b/d' -E /tmp/test.txt 

(與您現有的替換/tmp/test.txt文件路徑)

([0-9]{1,2}|[0][0-9]+) - 將匹配從0到之間的任意數字或帶有前導零的數字(例如, 01200982

d - 刪除模式空間;

-E--regexp-extended) - 使用擴展正則表達式,而不是基本的正則表達式


要刪除符合條件的行到位使用-i選項:

sed -i -E '/^\w+\s+([0-9]{1,2}|[0][0-9]+)\b/d' /tmp/test.txt 
+0

probably'sed -nE'/^[0-9] + \ s + 0 * [1-9] [0-9] {2,}/p''?這將忽略第二列中的前導零,但仍然得到第二列大於或等於100的行......如果第一列可以不是數字,那麼'\ S +'會比'\ w +'更好 – Sundeep

+0

@Sundeep,1 )作爲'sed -nE'/^[0-9] + \ s + 0 * [1-9] [0-9] {2,}/p'' - 是的,它可能是一種替代方案; 2)* \ S +會比\ w + *更好 - 我認爲它不會更好(根據性能方面) – RomanPerekhrest

+0

我想表達它會匹配任意字符而不是限制爲\ w 「......應該說得更好 – Sundeep