awk:设置开始和结束比赛

时间:2018-05-04 20:52:33

标签: regex awk

我有一个像这样的类似LaTeX的表(列由&分隔):

foobar99   &     68 
foobar4    &     43 
foobar2    &     73  

我希望使用match获取第2列的数字索引。

在Vim中,我们可以使用\zs\ze来设置匹配的开始和结束。 因此,为了准确匹配第2列的数字,我们可以使用^.*&\s*\zs[[:digit:]]\+\ze\s*$

awk怎么样?有没有等价的?

编辑:

匹配第一行:

foobar99   &     68 
                 ^^   

123456789012345678 

预期输出:18

EDIT2:

我正在编写一个awk脚本来处理由换行符分隔的块(因此,FS="\n"RS="")。上面的MWE只是其中一个块。

在第2列获取数字索引的一种可能方法是做类似的事情

split(line, cases, "&");
index = match(cases[2], /[[:digit:]]\+/);

但我正在寻找一种美妙的方式来做到这一点。

XY problem道歉。但我仍然对开始/结束匹配感兴趣。

3 个答案:

答案 0 :(得分:0)

上下文太少,所以一个简单的猜测:你试过将表拆分成列吗?使用awk -F '\\s*&\\s*'之类的内容,您可以在$2中找到第二列。

实际上,您可以使用split()来检索字符串的确切列:

split(s, a[, fs ])

Split  the  string  s into array elements a[1], a[2], ..., a[n], and 
return n.  All elements of the array shall be deleted before the split is 
performed. The separation shall be done with the ERE fs or with the field 
separator FS if fs is not given. Each array  element  shall  have  a  
string value  when  created  and,  if  appropriate, the array element 
shall be considered a numeric string (see Expressions in awk).  The 
effect of a null string as the value of fs is unspecified.

所以你的第二栏就像是

split(s, a, /\s*&\s*/)
secondColumn = a[2]

答案 1 :(得分:0)

默认情况下,awk会在数据中看到三列,而第2列只包含&(第3列包含数字)。如果将字段分隔符更改为&,那么您有两列在第1列中有尾随空格,在第2列中有前导空格(以及一些尾随空格,因为它发生;尝试从问题中复制数据)。 / p>

awk中,您可以通过添加0将带有前导空格的第2列转换为数字:$2 + 0会强制将其视为数字。如果您在数字上下文中使用$2,则会将其视为数字。相反,您可以强制awk通过与空字符串连接将字段视为字符串:$2 ""将是一个字符串。

因此,如果数据如图所示那么简单,那么就不需要复制正则表达式来获取数字。

你说你想用match;目前尚不清楚你需要什么。

awk -F'&' '{ printf "F1 [%s], F2 [%10s] = [%d] = [%-6d] = [%06d]\n", $1, $2, $2, $2, $2 }' data

对于您的数据,前两行末尾有一个空白,第三行末尾有一个空白,输出为:

F1 [foobar99   ], F2 [       68 ] = [68] = [68    ] = [000068]
F1 [foobar4    ], F2 [       43 ] = [43] = [43    ] = [000043]
F1 [foobar2    ], F2 [      73  ] = [73] = [73    ] = [000073]

请注意,我并不需要将$2显式转换为数字。 printf格式将其视为字符串或数字,具体取决于我使用的是%s还是%d

如果需要,您可以删除$1(或实际上$2)的尾随空白,但不知道您还需要做什么,很难证明替代方案有用地。

所以,我认为awk可以满足你的需要,而不需要你在篮球方面跳得太多。为了更好的解释,您需要提供更好的问题,描述或展示您想要做的事情。

答案 2 :(得分:0)

你可以试试这种方式

awk '{print index($0,$3)}' infile