2009-12-04 39 views
1

我的数据是这样的:的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当然

回答

6

在awk中,正则表达式位于包含花括号的print语句之前。所以你的情况,awk的调用将是:

awk '/^[0-9]/ {print $1}' 
0

,您可以:

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命令由一个实际的模式来匹配和命令来运行的。如果没有模式,该命令针对所有行运行。

2

您可以将grep的正则表达式awk命令直接:

data_display | awk '/^[0-9]/{ print $1 }' 
1

你可以使用cut代替awk

$ data_display | grep '^[0-9]' | cut -f 1 -d ' ' 
+0

为什么使用2个命令时,1已经这样做......生产开销 – ghostdog74 2009-12-04 11:57:20

+0

levislevis85,你应该总是测试你的假设。 awk是一种完整的编程语言,cut和grep是更简单的工具。你测试过哪个开销更大?我只是指向选项。 – Svante 2009-12-04 12:54:29

+0

无论如何,我认为awk不能使用'$ 1'机制时会出现'cut'。有趣的是,将正则表达式从外部grep移动到awk脚本中几乎没有区别 - 因此“附加命令”的开销似乎不重要。 – Svante 2009-12-04 13:00:15

1

为了更加准确,请检查实际数字(如果您有像1a这样的数据,但这不是数字,但会使用迄今为止给出的解决方案进行匹配。)

$ awk '$1+0==$1' file 

awk '$1 ~/^[0-9]+$/' file 
+0

很适合显示正则表达式比较运算符“〜” – 2009-12-04 14:52:51

1

切-d”'-f1文件名| grep'^ [0-9]'

这应该是最快的。因为awk会将文件分类为记录和字段。

在这里,我们正在最小化grep需要通过切割第一个字段来处理的数据量。