提取每个第n个字母(数字)

时间:2010-09-03 13:05:47

标签: regex sed awk

我有一个带行的文件:名称,空格和字符串零和一,我需要提取零和一的字符串的每个第5个字符,得到结果的总和,如果总和不是0 - 将名称保存到另一个文件中。

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

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

提前多多谢谢!

4 个答案:

答案 0 :(得分:1)

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

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

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

每隔5 0或1完成一次工作。

答案 1 :(得分:0)

尝试....(.)

  • ....匹配四个任意字母
  • (.)匹配第五个字母并将其捕获。

我不确定sed / awk regexp语法,所以你可能不得不逃避parens。

答案 2 :(得分:0)

从stdin读取:

#!/bin/bash

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

读取每一行,使用sed提取每五位,然后将该数字与((num > 0))进行比较。阅读&&,如果 - 那么:如果数字大于零,则回显名称。

答案 3 :(得分: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