给定以下输入:
check1;check2
check1;;check2
check1,check2
和awk
命令:
awk -F';+|,' '{print $1 FS $2}'
FS
应包含选定的分隔符?
如何打印所选的分隔符,即;
、;;
或,
描述分隔符的正则表达式。
如果输入check1;check2
则输出应check1;check2
。
如果你使用的是 GNU Awk (gawk),你可以使用 split()
的第 4 个参数:
gawk '{split($0, a, /;+|,/, seps); print a[1] seps[1] a[2]}' file
输出:
check1;check2
check1;;check2
check1,check2
在循环中使用它也很容易处理:
gawk '{nf = split($0, a, /;+|,/, seps); for (i = 1; i <= nf; ++i) printf "%s%s", a[i], seps[i]; print ""}' file
22011,25029;;3331,25275
6740,16516;;27292,1217
13480,31488;;7947,18804
328,30623;;12470,6883
如果您只需要字段,则只需触摸a
。分隔符将按seps
分隔,并且这些分隔符的索引与a
对齐。
我不认为awk将匹配的分隔符存储在任何地方。如果你使用 GNU awk,你可以自己做:
gawk '{match($0, /([^;,]*)(;+|,)(.*)/, a); print a[1], a[2], a[3]}'
GNU awk 对记录而不是字段有这个特性,所以你也可以做这样的事情:
$ awk '{printf "%s%s",$0,RT}' RS=';+|,|n' file
check1;check2
check1;;check2
check1,check2
其中RT
是给定记录的RS
值匹配,您可以通过以下方式查看:
$ awk '{printf "%s",RT}' RS=';+|,|n' file
;
;;
,