我有一个类似的问题打印匹配前后的文本,从特定的开头到结束字符串但有一个转折。
我的文件是一个手动构建的大型 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