我的数据是这样的:的Unix awk命令的正则表达式的问题
# data_display
ab as we hj kl
12 34 45 83 21
45 56 98 45 09
我只需要单独的第一列,只有开始与数行。
我现在使用:
# data_display | awk '{ print $1 }' | grep "^[0-9]"
有没有什么办法能够更优化它,就像在AWK本身使用正则表达式?
我对awk很新。
谢谢。
KK当然
我的数据是这样的:的Unix awk命令的正则表达式的问题
# data_display
ab as we hj kl
12 34 45 83 21
45 56 98 45 09
我只需要单独的第一列,只有开始与数行。
我现在使用:
# data_display | awk '{ print $1 }' | grep "^[0-9]"
有没有什么办法能够更优化它,就像在AWK本身使用正则表达式?
我对awk很新。
谢谢。
KK当然
在awk中,正则表达式位于包含花括号的print语句之前。所以你的情况,awk的调用将是:
awk '/^[0-9]/ {print $1}'
,您可以:
pax> echo 'ab as we hj kl
12 34 45 83 21
45 56 98 45 09' | awk '/^[0-9]/ {print $1}'
为您提供:
12
45
Awk
命令由一个实际的模式来匹配和命令来运行的。如果没有模式,该命令针对所有行运行。
您可以将grep的正则表达式awk命令直接:
data_display | awk '/^[0-9]/{ print $1 }'
你可以使用cut
代替awk
:
$ data_display | grep '^[0-9]' | cut -f 1 -d ' '
为了更加准确,请检查实际数字(如果您有像1a这样的数据,但这不是数字,但会使用迄今为止给出的解决方案进行匹配。)
$ awk '$1+0==$1' file
或
awk '$1 ~/^[0-9]+$/' file
很适合显示正则表达式比较运算符“〜” – 2009-12-04 14:52:51
切-d”'-f1文件名| grep'^ [0-9]'
这应该是最快的。因为awk会将文件分类为记录和字段。
在这里,我们正在最小化grep需要通过切割第一个字段来处理的数据量。
为什么使用2个命令时,1已经这样做......生产开销 – ghostdog74 2009-12-04 11:57:20
levislevis85,你应该总是测试你的假设。 awk是一种完整的编程语言,cut和grep是更简单的工具。你测试过哪个开销更大?我只是指向选项。 – Svante 2009-12-04 12:54:29
无论如何,我认为awk不能使用'$ 1'机制时会出现'cut'。有趣的是,将正则表达式从外部grep移动到awk脚本中几乎没有区别 - 因此“附加命令”的开销似乎不重要。 – Svante 2009-12-04 13:00:15