Awk 3 Spaces + 1个空格或连字符

时间:2015-02-07 03:45:03

标签: regex bash awk

我有一个相当大的图表要解析。每列由4个空格或3个空格和连字符分隔(因为图表中的数字可以是负数)。

cat DATA.txt | awk "{ print match($0,/\s\s/) }"

除了打印一大堆0之外什么都不做。我试图理解AWK以及何时逃跑等等,但我并没有理解它。感谢帮助。

一行:

1979  1   -0.176   -0.185   -0.412    0.069   -0.129    0.297   -2.132   -0.334   -0.019
1979  1   -0.176    0.185   -0.412    0.069   -0.129    0.297   -2.132   -0.334   -0.019

我想说的是第二栏。我复制了这一行,但我想看-0.185和0.185。

3 个答案:

答案 0 :(得分:3)

你需要首先考虑bash引用,因为它是bash,它将awk的参数解释为awk程序。在双引号字符串中,bash$0扩展为bash可执行文件(或当前脚本)的名称;这几乎肯定不是你想要的,因为它不会是一个带引号的字符串。事实上,你几乎不想在awk程序参数周围使用双引号,所以你应该养成写awk '...'的习惯。

此外,awk正则表达式并不理解\s(尽管Gnu awk会将其作为扩展名处理)。并且match会返回比赛的位置,我不认为你关心比赛。

默认情况下,awk会将任何空白序列视为字段分隔符,因此您不需要玩任何游戏来获得第四列。只需使用awk '{print $4}'

即可

答案 1 :(得分:1)

为什么不使用这个简单的awk

awk '$0=$4' Data.txt
-0.185
0.185

它将$0设置为$4中的值并执行默认操作print PS不会将cat与可以自行读取数据的程序一起使用,例如awk

如果归档4包含0,则可以使其更加健壮,如:

awk '{$0=$4}1' Data.txt

答案 2 :(得分:0)

如果您尝试根据3或4个空格分割输入,那么您将仅从第3列获得预期输出。

$ awk -v FS=" {3,4}" '{print $3}' file
-0.185
0.185

FS=" {3,4}"这里我们将正则表达式作为FS值传递。解析此正则表达式并将Field Separator值设置为三个或四个空格。在正则表达式{min,max}中称为范围量词,它从最小到最大时间重复前一个标记。