awk를 사용하여 일치 항목을 찾고 각 일치 항목 앞에 문자를 추출합니다. - 도와주세요!

awk를 사용하여 일치 항목을 찾고 각 일치 항목 앞에 문자를 추출합니다. - 도와주세요!

비슷한 문제가 있습니다문자열의 특정 시작부터 끝까지 일치 전후의 텍스트를 인쇄합니다.하지만 반전이 있습니다.

내 파일은 수동으로 작성된 대용량 CSV 파일입니다. 여기에는 "WAP"라는 문자열이 여러 번 포함되어 있습니다. 내 임무는 WAP 문자열의 모든 인스턴스를 감지하고 해당 문자가 숫자인 경우 이전 두 문자의 일치 항목을 각각 인쇄하는 것입니다.

저는 이와 같은 문자열 검색을 수행한 적이 없으므로 귀하가 제공할 수 있는 지침이 제 작업에 큰 도움이 될 것입니다. 다들 감사 해요.

~다니엘~

Sample from spreadsheet: ,x,x,x,x,x,xx,Yes,"1 WAP, other stuff, other stuff",no,x

Intended output from that line: 1

이전에 awk를 사용해 본 적이 없기 때문에 여기까지 왔습니다.

awk '/WAP/{인쇄}' ~/spreadsheets/waps.csv

일치하는 모든 줄을 인쇄하려는 것 같습니다. 내가 해야 할 일은 루프를 계속 실행하고 WAP가 일치할 때까지 문자를 축적한 다음 두 문자를 앞으로 가져오는 것입니다. 하지만 제가 마지막으로 이 일을 한 것은 제가 대학에 다닐 때인 1999년이었습니다.

답변1

다음은 샘플 awk스크립트입니다.

 awk '/..WAP../{print substr($0, index($0,"WAP") - 2, 7);}' input.csv

입력 예:

junk
line 1 12WAP34 678
another line  abWAPcdefg
WAP123
junk WAP

산출:

12WAP34
abWAPcd

설명하다:

/..WAP../{                          # for line containt WAP with 2 chars wrap
    wapPosition = index($0,"WAP") - 2;  # find the position of WAP - 2 chars
    output = substr($0, wapPosition, 7);# output is 7 chars length from wapPostion
    print output;                   # print output
}

답변2

GNU Awk를 사용하면 함수 내에서 캡처 그룹을 사용 match하고 선택적 배열 인수를 통해 해당 내용에 액세스할 수 있습니다.

$ echo ',x,x,x,x,x,xx,Yes,"1 WAP, other stuff, other stuff",no,x' | 
    awk 'match($0,/([0-9]).WAP/,a) {print a[1]}'
1

match더 편리하게 +를 substr다음과 같이 사용할 수 있습니다 .

awk 'match($0,/[0-9].WAP/) {print substr($0,RSTART,1)}'

답변3

WAP이것이 행당 한 번만 발생할 수 있다고 가정하면 이것이 아마도 당신이 정말로 원하는 것이라고 생각합니다. 다음 입력 파일이 주어지면:

$ cat file
,x,x,x,x,x,xx,Yes,7,WAP,no,x
,x,x,x,x,x,xx,Yes,3 WAP,no,x
,x,x,x,x,x,xx,Yes,"1 WAP",no,x

GNU awk 사용:

$ awk 'match($0,/([0-9])[^,]WAP/,a){print a[1]}' file
3
1

어떤 이상한 경우 :

$ awk 'match($0,/[0-9][^,]WAP/){print substr($0,RSTART,1)}' file
3
1

관련 정보