羣裏的討論呵,將自個的答案發到blog上來
111110001111111011111111111100111111000011111000111111101111111111110011111100001111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111111111110011111100001111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111
seq 300|sed 's/.*//;n;s/.*//;n;s/.*//;n;s/.*//;n;n;n;n'|sed -n '1!G;$p;h'|sed 's/.*//;n;s/.*//;n;s/.*//;n;s/.*//;n;s
/.*//;n;n;n;n;n'|sed '/^$/d'|sed -n '$='
我發現自個在分析問題的時候,總是要給自己多設定條件了。使問題複雜化了
比如我那答案,事實上在考慮的時候,思維裏就增加了一個條件:腳本應用於多行文件的,並分別得出每行的計算值了。
因此,我那答案在管道傳輸之羊,都是單行對單行的,
簡單的說,在這種方法下各管道的sed,實際上可以直接合併成一個sed命令;
分開只是按思路上的分步進行處理
而sun的思路,不受這個限制的,很好的利用了管道間的行列轉化呵。
於是想到的另一個解法:
perl -e 'print "0"x300;print "/n"'|sed -r 's/./a/g; s/(.{1,5})(.{0,5})//U/1/E/2/g;:a;//`/w/s//w{1,4}$//n/U&/m;//s//w{1,4}$//n&/m;ta; y/aA/n/01/x0/'
111110001111111011111111111100111111000011111000111111101111111111110011111100001111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111111111110011111100001111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111
這個是目前能想到不用管道的方法了-_-(用管道就不能體現sed的圖靈完備性了呵,這裏假設輸入已經給出)
當然,要想得到0的數值,加管道就簡單多了,當然,用管道的話,再用sed就沒多少意義了,隨便用grep或wc啥的
可以
perl -e 'print "0"x300;'|sed -r 's/./a/g; s/(.{1,5})(.{0,5})//U/1/E/2/g;:a;//`/w/s//w{1,4}$//n/U&/m;//s//w{1,4}$//n&/m;ta; y/aA/n//n/x0/x0/ ' |sed -n '$='
74
[root@localhost ~]# perl -e 'print "0"x300;'|sed -r 's/./a/g; s/(.{1,5})(.{0,5})//U/1/E/2/g;:a;//`/w/s//w{1,4}$//n/U&/m;//s//w{1,4}$//n&/m;ta; y/aA/n/0/x0/x0/ ' |wc -c
74
其實,sed做爲圖靈完備(爲什麼現在老把sun這句話掛麪嘴裏了哈?),並不需要用多個命令(通道),單sed命令完全可以搞定
[root@localhost ~]# perl -e 'print "0"x300;print "/n"'|sed -nr 's/./a/g; s/(.{1,5})(.{0,5})//U/1/E/2/g;:a;//`/w/s//w{1,4}$//n/U&/m;//s//w{1,4}$//n&/m;ta; y/aA/n/0/x0/x0/; x; s/.*/0/; G; x; :b; /./! bout; s/.//; H; g; s//n.*//g; s/^9*$/0&/; s/.9*$/x&/; H; s/.*x//; y/0123456789/1234567890/; G; s/([^/n]*)/n.*/n([^/n]*)/n.*/n([^/n]*)x.*$//3/1/n/2/; x;s/.*/n([^/n]*)/n[^/n]*//1/; bb; :out; g;s//n/ /; s/ .*//;p'
74
前半部分相同,後半部分是之前寫的一個sed行字符統計腳本,帶原記錄的,如果不想帶原記錄,可以更簡化
n:初始字符個數,例子中爲300
l:從左邊開始間隔切換的個數,這邊爲5
r:從右邊開始間隔切換的個數,這邊爲4
代碼:
(輸出第一行爲結果,第二行爲0字符數和1字符數
[root@localhost sed]# awk 'BEGIN{n=300;l=5;r=4;c=0;for(i=1;i<=n;i++){k=i%(2*l);j=(n-i+1)%(2*r);if((k>=1&& k<=l)||(j>=1 && j<=r)){printf "1"}else{printf "0";c++}};print "/n"c,n-c}'
111110001111111011111111111100111111000011111000111111101111111111110011111100001111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111111111110011111100001111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111
74 226
[root@localhost sed]# awk 'BEGIN{n=100;l=5;r=4;c=0;for(i=1;i<=n;i++){k=i%(2*l);j=(n-i+1)%(2*r);if((k>=1&& k<=l)||(j>=1 && j<=r)){printf "1"}else{printf "0";c++}};print "/n"c,n-c}'
1111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111
24 76
111110001111111011111111111100111111000011111000111111101111111111110011111100001111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111111111110011111100001111100011111110111111111111001111110000111110001111111011111111111100111111000011111000111111101111