2013-09-21 2 views
2

Учитывая следующий вход:печать фактического значения разделителя поле не регулярное выражение

check1;check2 
check1;;check2 
check1,check2 

и awk команду:

awk -F';+|,' '{print $1 FS $2}' 

FS должен содержать выбранный разделитель?

Как вы можете напечатать разделитель, который выбран т.е. либо из ;, ;; или , не регулярное выражение, которое описывает разделители.

Если вход check1;check2, то выход должен быть check1;check2.

ответ

4

Я не думаю, что awk хранит соответствующий разделитель где угодно. Если вы используете GNU AWK, вы можете сделать это самостоятельно:

gawk '{match($0, /([^;,]*)(;+|,)(.*)/, a); print a[1], a[2], a[3]}' 
+0

Спасибо за блестящее решение. – user1502952

6

Если вы используете GNU Awk (поглазеть), вы можете использовать 4-ый аргумент split():

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.

+0

Спасибо, это сработало – user1502952

+1

+1 лучший ответ, чем мой –

+1

Это был полезный и подробный ответ, +1 :) – zx81

2

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 
; 
;; 
,