awk删除非数字值

时间:2014-07-27 11:45:08

标签: awk

我只需要保留以'ab'开头的行; 'ab'和'cd'之间没有字母。从这些方面来说,我需要删除'ab'和'cd'。

输入:

abI am jhoncd
ab32.58cd
abI live in USAcd
ab22. I was born in NYcd
ab58.2cd
ef

输出:

32.58
58.2

thanx伙计们!

4 个答案:

答案 0 :(得分:1)

$ sed -n -r 's/^ab([^[:alpha:]]+)cd/\1/p' file
32.58
58.2

$ awk '/^ab([^[:alpha:]]+)cd/{gsub(/ab|cd/,""); print}' file
32.58
58.2

我怀疑你真正想要的是:

$ sed -n -r 's/ab([[:digit:].]+)cd/\1/p' file
32.58
58.2

$ awk '/ab([[:digit:].]+)cd/{gsub(/ab|cd/,""); print}' file
32.58
58.2

即。而不是删除包含所请求字母的行,选择仅包含ab和cd之间的数字和句点的行。

答案 1 :(得分:0)

使用grep:

grep -oE '[0-9]+[.][0-9]+' file

其他形式:

grep -oE '[[:digit:]]+[.][[:digit:]]+' file
grep -o '[0-9]\+[.][0-9]\+' file

awk的另一个:

awk '{ while (match($0, /[0-9]+[.][0-9]+/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' file

更新

grep -oE '[0-9]+([.][0-9]+)?' file

awk '{ while (match($0, /[0-9]+([.][0-9]+)?/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' file

答案 2 :(得分:0)

通过awk,

$ awk '/^ab[^a-z]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file

OR

$ awk '/^ab[^[:alpha:]]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file
32.58
58.2

上面的awk命令搜索以ab开头的行,后面跟不是字母(或字母)字符的一行或多行,后面跟着字符串cd。如果找到任何内容,则会通过awk的内置ab函数删除字符串cdgsub。最后,结果被重定向到标准输出。

模式说明:

  • ^断言我们处于行首。
  • ab匹配字符串ab
  • [^a-z]+匹配任何不属于a-z一次或多次的字符。
  • cd匹配字符串cd
  • $行尾。

答案 3 :(得分:0)

awk可能会:

awk -F"ab|cd" '$2~/^[0-9.]+$/ {print $2}' file
32.58
58.2

编辑 如果您有awk等,则上面的ab45.23ab会失败。 这个gnu awk会更好:

awk -F"cd" -v RS="ab" 'NF==2 && $1~/^[0-9.]+$/ {print $1}' file
32.58
58.2