AWK: 특정 패턴이 포함되지 않은 특정 줄을 제거하는 방법은 무엇입니까?

AWK: 특정 패턴이 포함되지 않은 특정 줄을 제거하는 방법은 무엇입니까?

공백-대시-공백으로 구분된 다양한 영숫자 문자열이 있는 줄이 포함된 파일이 있습니다. 그러나 하나의 영숫자 값과 구분 기호만 있고 다른 문자열 값이 누락된 줄이 있습니다. 예:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613
DK0060056323-DKK -
DK0060186294-DKK -

위 샘플의 마지막 두 줄에는 구분 기호 오른쪽에 영숫자 문자열이 없으므로 제거하고 싶습니다. 다음 awk 표현식을 사용하려고 했습니다.

awk '!/* - /' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

!/* - /내 말은 "문자(*) 뒤에 공백-대시 공백( - )이 있고 그 뒤에 아무것도 없는 패턴을 찾고, 그러한 패턴이 없으면(!)" 나머지 줄을 temp로 이동한다는 의미입니다 . txt 파일을 만들고 sourcefile.txt 내용을 temp.txt 내용으로 바꿉니다. 그러나 위의 awk 스크립트를 실행할 때 sourcefile.txt 내용에는 아무 일도 일어나지 않습니다. 모든 것이 동일하게 유지됩니다. 나도 오류가 발생하지 않습니다. 여기서 무엇이 잘못되었을 수 있습니까? 위의 샘플 라인을 고려하면 awk 스크립트를 실행한 후 원하는 출력은 다음과 같아야 합니다.

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

답변1

영숫자 문자로 끝나는 줄을 인쇄하는 방법은 간단합니다.

$ awk '/[[:alnum:]]$/' file
MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

답변2

훨씬 더 간단합니다:

awk '$3' inputfile

이것은 의 약어입니다 awk '$3!=""'. 이는 의 약어이며 awk '$3!=""{print}', 이는 의 약어입니다.awk '$3!=""{print $0}'

참고로:

sed /-$/d아마도 더 빠르고, grep -ve '-$'훨씬 더 빠를 것입니다.

답변3

@guillermo chamorro 제안 덕분에 다음과 같은 방법으로 스크립트를 수정하여 원하는 결과를 얻을 수 있었습니다.

awk '!/^.* -$/' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

길예르모에게 감사드립니다.

관련 정보