2010-09-03 66 views
2

我有一个文件的行:名称,空间和零和一个字符串,我需要提取零和一个字符串的每个第5个字符,将结果和如果总和不为0 - 将名称保存到其他文件中。提取每个第n个字母(数字)

1rt2 0001000000100000000000001010000100000000010000001000000100010010000000000000 
1gh4 0001000000100000000000001010000100000000010000001000000100000010000000000000 
3fg5 1000000100010010000000000000100000010000000001000000100000010000000000000000 
45gh 1000000100000010000000000000100000010000000001000000000100010000000000000000 

问题:如何提取bitstring的每第5个数字(字母)?更简单的解决方案 - 更好...

提前致谢!

+0

感谢的很多大家!模式“....(。)”适合我! – chupvl 2010-09-03 14:00:12

回答

0

尝试....(.)

  • ....匹配任意四个字母
  • (.)相匹配的第五个字母和捕捉它。

我不确定sed/awk正则表达式的语法,所以你可能不得不逃离parens。

0

从stdin读取:

#!/bin/bash 

while read name bits; do 
    (($(sed 's/....(.)/$1/g' <<< "$bits") > 0)) && echo "$name" 
done 

读取每一行中,使用sed来提取每第五个比特,则该数量与比较((num > 0))。阅读&&就好像然后:如果该数字大于零,则回显名称。

1
sed -e '/ \(.........\)*........1/s/^\([^ ]*\) .*$/\1/;t;d' 

匹配对是9的倍数的位置上具有1的行(对于这些行的总和不会为0),并打印该行的文件名部分。所有其他行都不打印。

sed -e '/ \(.....\)*....1/s/^\([^ ]*\) .*$/\1/;t;d' 

将做的工作,每5 0或1

+0

+1推广你的选择模式:'/ \([01] \ {5 \} \)* [01] \ {4 \} 1 /' – 2010-09-03 15:46:56

0
awk '{ 
name=$1 
m=split($2,n,"") 
for(o=1;o<=m;o+=4){ 
    total+=n[o] 
} 
if(total>0){ 
    print name > "file" 
} 
}' file