2017-11-10 13 views
1

구분자가 "|^/" 인 대상 파일이 있습니다.awk에서 여러 문자를 단일 구분 기호로 사용하려면 어떻게해야합니까?

예 :

123|^/qwe|^/po9076|^/env12|^/opti|^/546454 

이제 요구 사항은 각 행의 필드 수를 얻는 것입니다.

나는 아래와 같이 피곤했지만 정확한 결과를주지 못했습니다.

echo "123|^/qwe|^/po906|^/env12|^/opti|^/54644" | awk -F'|^/' '{print NF; exit}' 

이 문제는 어떻게됩니까?

참고 :가있을 수 있습니다 필드 값의 내부 | 또는 ^ 또는 /. 따라서 구분 기호는 조합|^/이어야합니다.

답변

2
$ echo "123|^/qwe|^/po906|^/env12|^/opti|^/54644" | awk -F'\\|\\^/' '{print NF; exit}' 
6 

man awkgoogle regular expressions.

+0

이것은 아마도 awk -F로 분명합니다. \\\\ | \\\ \ ^/"...":) –

+1

나는 당신이 농담을한다고 가정합니다 :-). –

+1

Ed Morton에게 도움을 주셔서 대단히 감사합니다. 그것은 매력처럼 일했습니다! – Mukesh

0

당신은 필드 구분자로 중괄호 표현 (또는 문자 클래스)를 사용한다 :

echo "123|^/qwe|^/po906|^/env12|^/opti|^/54644" | awk -F '[|^/]+' '{print NF; exit}' 

6 

정규식 [|^/]+ 입력 필드 구분자로 [...] 내에서 주어진 문자 중 하나 이상을 만들 것입니다.

+0

OP의 메모에서 질문을 이해하면 구분 기호는 문자 그대로 세자리 시퀀스 '|^/'입니다. "조합"이라는 단어를 사용하는 것은 혼란 스럽지만 OP는 해당 문자가 _value_ 필드에있을 수 있다고 말하고있는 것 같습니다. 따라서이 세 문자 모두가 구분 기호로 필요합니다. – jas

+0

예, 값 중 하나가'abc | def'라면 상상해보십시오. FS가 두 필드로 계산하지 않겠습니까? – jas

+0

예, 물론이 정규식은 두 개의 필드로 취급 할 것입니다. – anubhava