2016-11-14 34 views
1

我在bash工作,我有,我想刪除所有不符合特定正則表達式,該行大文件可能使用$ grep -e "<regex>" <file> > output.txt正則表達式字符出現恰好x次

我想保留什麼是包含正好X倍指定字符,例如在二進制序列

0000,0001,0010,0011,0100,0101,0111,1000,1001,1010,1011,1100的任何行, 1101,1110,1111

我想只保留那些誰擁有2 ,留下我與

0011,0101,0110,1001,1010,1100

然後,我會用一個bash變量改變 我litterally尋找是半線(與相同長度的字符串工作總是精確長度的一半,)我需要的量半

我現在有這個權利。它不使用正則表達式。它的工作原理,但速度很慢:

$1是每一個字符串的長度,$d只是一個目錄)

sed -e 's/\(.\)/\1 /g' < $d/input.txt > $d/spaces.txt 
awk '{c=0;for(i=1;i<=NF;++i){c+=$i};print c}' $d/spaces.txt > $d/sums.txt 
grep -n "$(($1/2))" $d/sums.txt | cut -f1 -d: > $d/linenums.txt 
for i in $(cat $d/linenums.txt) 
do 
    sed "${i}q;d" $d/input.txt 
done > $d/valids.txt 

如果你想知道這使空間中每個數字轉向1010之間爲1 0 1 0,然後將這些值相加,將結果保存在sums.txt中,將grep保存爲length/2,並僅將行號保存在linenums.txt中,然後讀取linenums.txt並將相應的行從input.txt輸出到output.txt

我需要更快一點的for循環是什麼東西太長了

感謝您的時間,並與我分享您的知識。

+0

如何KISS? 'grep -E'0011 | 0101 | 0110 | 1001 | 1010 | 1100'' – janos

回答

2

你絕對可以做得更快。

這裏是一個grep正則表達式的例子,以配合準確的兩次出現1任何行:

grep '^\([^1]*1[^1]*\)\{2\}$' input.txt 

可以概括這正好相匹配n出現c

grep "^\([^$c]*$c[^$c]*\)\{$n\}\$" input.txt 

你也提到想匹配一半爲0 s,一半爲1 s的行。你既然規定,所有的線的長度是相同的,你可以考慮只在第一行,並使用awk(或wc),以獲得線的長度和選擇n

n=`head -n1 input.txt | awk '{printf "%d\n",length($0)/2}'` 
c=1 
grep "^\([^$c]*$c[^$c]*\)\{$n\}\$" input.txt 
+1

好的,非常感謝,它可以工作,它的速度比我的要快得多。使用小樣本文件使我認爲它運行良好,但是當處理65536(2^16)個條目時,它顯示事情有多慢,我自己解決了第一部分,但是這個讓我想了一會兒! – JFs743

相關問題