awk를 사용하여 여러 문자 구분 기호로 필드를 구분하세요.

awk를 사용하여 여러 문자 구분 기호로 필드를 구분하세요.

로 구분된 행으로 필드를 인쇄하고 싶습니다 |~^. 여러 가지 방법을 시도했지만 인쇄 필드를 작동시킬 수 없습니다 awk. 아래는 참고용 파일 내용입니다.

입력하다

H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-05|~^10.00
R|~^abc|~^2019-03-05|~^20.00
R|~^abc|~^2019-03-05|~^30.00
R|~^abc|~^2019-03-06|~^100.00
R|~^abc|~^2019-03-06|~^15.00
R|~^abc|~^2019-03-06|~^10.00
T|~^20200425|~^6|~^185.00

|~^구분 기호 기반을 사용하여 필드를 구분 해야 합니다 awk. 나는 노력했다

cat input |grep "^T"|awk -F '|~^' '{print $2}'

그러나 null을 반환합니다.

어떤 제안이 있으십니까?

답변1

awk귀하가 직면한 문제는 (GNU) 맨페이지[1]의 다음 설명과 관련이 있는 것 같습니다.

FS가 단일 문자인 경우 필드는 해당 문자로 구분됩니다. FS가 빈 문자열인 경우 각 개별 문자는 별도의 필드가 됩니다.그렇지 않으면 FS는 완전한 정규식이어야 합니다..

필드 구분 패턴에는 정규식에서 특별한 의미를 갖는 문자(the |및 the ^)가 포함되어 있으므로 해당 문자를 올바르게 이스케이프 처리해야 합니다. awk변수가 해석되는 방식 때문에 (문자열 리터럴 구문 분석)두 배), 다음을 사용하여 지정해야 합니다.이중 백슬래시,좋다

awk -F '\\|~\\^' '{print $2}' input.txt

귀하의 예에 대한 결과 출력은 다음과 같습니다.

20200425
abc
abc
abc
abc
abc
abc
20200425

T다음 으로 시작하는 줄만 고려하려면

awk -F '\\|~\\^' '/^T/ {print $2}' input.txt

또는 특정 필드(여기서는 첫 번째 필드)의 값이 다음과 같은 행만 선택하면 됩니다 T.

awk -F '\\|~\\^' '$1=="T" {print $2}' input.txt

두 경우 모두 예제 결과

20200425

일반적으로 , 및 를 사용할 필요가 거의 awk없습니다 grep. sed또한 이러한 도구는 모두 파일에 직접 액세스할 수 있으므로 cat처리하기 위해 텍스트를 제공할 필요가 없습니다.

[1]: (관련되지 않은) 참고 사항: "빈 문자열"이 있는 부분은 모든 Awk 변형에서 작동하지 않습니다. GNU Awk 매뉴얼에는 다음과 같은 내용이 나와 있습니다."이것은 일반적인 확장입니다. POSIX 표준에서는 이를 지정하지 않습니다."

답변2

예시를 찾았습니다여기약간 수정되었습니다.

또 다른 방법은 다른 구분 기호로 바꿔서 사용하는 것입니다.

cat infile |sed "s/|~^/,/g"
H,20200425,abcd,sum
R,abc,2019-03-05,10.00
R,abc,2019-03-05,20.00
R,abc,2019-03-05,30.00
R,abc,2019-03-06,100.00
R,abc,2019-03-06,15.00
R,abc,2019-03-06,10.00
T,20200425,6,185.00

$ cat infile |sed "s/|~^/,/g" | cut -d',' -f2-3
20200425,abcd
abc,2019-03-05
abc,2019-03-05
abc,2019-03-05
abc,2019-03-06
abc,2019-03-06
abc,2019-03-06
20200425,6

2after는 -f시작 열과 3끝 열입니다.

관련 정보