![awk를 사용하여 여러 문자 구분 기호로 필드를 구분하세요.](https://linux55.com/image/172010/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%97%AC%EB%9F%AC%20%EB%AC%B8%EC%9E%90%20%EA%B5%AC%EB%B6%84%20%EA%B8%B0%ED%98%B8%EB%A1%9C%20%ED%95%84%EB%93%9C%EB%A5%BC%20%EA%B5%AC%EB%B6%84%ED%95%98%EC%84%B8%EC%9A%94..png)
로 구분된 행으로 필드를 인쇄하고 싶습니다 |~^
. 여러 가지 방법을 시도했지만 인쇄 필드를 작동시킬 수 없습니다 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
2
after는 -f
시작 열과 3
끝 열입니다.