使用 awk 查找匹配项并从每个匹配项之前提取字符 - 帮助!

使用 awk 查找匹配项并从每个匹配项之前提取字符 - 帮助!

我有一个类似的问题打印匹配前后的文本,从特定的开头到结束字符串但有一个转折。

我的文件是一个手动构建的大型 CSV 文件。它多次包含字符串“WAP”。我的工作是检测字符串 WAP 的所有实例,并打印每次匹配之前两个字符的字符,只要该字符是数字。

我从来不需要像这样进行字符串搜索,因此您可以提供的任何指导将对我的任务有很大帮助。谢谢大家。

〜丹尼尔〜

Sample from spreadsheet: ,x,x,x,x,x,xx,Yes,"1 WAP, other stuff, other stuff",no,x

Intended output from that line: 1

这就是我所取得的进展,因为我以前从未使用过 awk:

awk '/WAP/{print}' ~/spreadsheets/waps.csv

这似乎想打印每个匹配的行。我认为我需要做的是保持一个循环运行,累积字符直到 WAP 匹配,然后提前获取两个字符。但上一次我这样做是在 1999 年上大学的时候。

答案1

这是一个示例awk脚本。

 awk '/..WAP../{print substr($0, index($0,"WAP") - 2, 7);}' input.csv

示例输入:

junk
line 1 12WAP34 678
another line  abWAPcdefg
WAP123
junk WAP

输出:

12WAP34
abWAPcd

解释:

/..WAP../{                          # for line containt WAP with 2 chars wrap
    wapPosition = index($0,"WAP") - 2;  # find the position of WAP - 2 chars
    output = substr($0, wapPosition, 7);# output is 7 chars length from wapPostion
    print output;                   # print output
}

答案2

使用 GNU Awk,您可以在函数中使用捕获组match并通过可选的数组参数访问其内容:

$ echo ',x,x,x,x,x,xx,Yes,"1 WAP, other stuff, other stuff",no,x' | 
    awk 'match($0,/([0-9]).WAP/,a) {print a[1]}'
1

更方便的是,您可以使用match+substr作为

awk 'match($0,/[0-9].WAP/) {print substr($0,RSTART,1)}'

答案3

假设WAP每行只能发生一次,我认为这可能是您真正想要的。给定这个输入文件:

$ cat file
,x,x,x,x,x,xx,Yes,7,WAP,no,x
,x,x,x,x,x,xx,Yes,3 WAP,no,x
,x,x,x,x,x,xx,Yes,"1 WAP",no,x

使用 GNU awk:

$ awk 'match($0,/([0-9])[^,]WAP/,a){print a[1]}' file
3
1

对于任何 awk:

$ awk 'match($0,/[0-9][^,]WAP/){print substr($0,RSTART,1)}' file
3
1

相关内容