我有一个相当大的图表要解析。每列由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。
答案 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}
中称为范围量词,它从最小到最大时间重复前一个标记。