awk: 필드 길이 확인

awk: 필드 길이 확인

존재하다 awk. 저는 Solaris 10을 사용하고 있으므로 이전 버전일 수 있습니다 awk. 최소한 특정 입력에 대해서는 작동하는 기본 농담을 생각해 냈습니다.

awk -F\; '$3 ~ /[ ]*...............................*/' file.csv 

구분 기호 주위에는 공백이 있을 수도 있고 없을 수도 있으므로 [ ]*정규식의 일부입니다.

~ 고 싶어요.도트 문자를 30번 인쇄하지 마세요., 다음을 시도했습니다.

awk -F\; '$3 ~ /[ ]*.\{30\}.*/{print $3}' file.csv

결과가 반환되지 않았습니다. 어떤 식으로든 도움이 된다면 를 사용하고 있습니다 ksh88.

연속된 30개 지점을 입력하지 않는 가장 좋은 방법은 무엇입니까?

답변1

awk -F\; 'length($3) == 30' file.csv

그림에 표시된 것처럼 공백이 있을 수 있는 경우 공백을 필드 구분 기호의 일부로 만들어 제거할 수 있습니다.

awk -F' *; *' 'length($3)==30' file.csv

답변2

GNU awk는 간격 표현식과 항상 일치하지 않습니다. 여기에 문제가 있습니다.{N}문법이 필요합니다. POSIX 호환 awks는 -W re-interval이 구문 활성화를 허용할 수 있으므로 시도해 보십시오. 그러나 공백 구문을 전혀 허용하지 않는 awk의 System V 파생 버전을 실행 중일 수도 있습니다.

최선의 선택은 FS를 정규식으로 설정하는 것입니다. 그러면 세미콜론 주위의 공백을 필드 구분 기호의 일부로 처리할 수 있습니다. 이것은 오래된 awk 기능이며 현재 사용 중인 awk에서 지원될 수 있습니다. 공백을 제거한 후 점으로 가득 찬 정규식을 생략하고 length() 함수를 사용하여 필드 길이를 확인할 수 있습니다.

awk -F"[ ]*;[ ]*" 'length($3) == 30 { print $3 }' file.csv

답변3

내가 올바르게 이해했다면 주변 공백을 포함하지 않고 최소 30자 길이의 줄에 세 번째 필드를 인쇄하려고 합니다.

awk -F ';' 'match($3, "[^ ].*[^ ]") && RLENGTH >= 30'

관련 정보