grep을 사용하여 구조화된 텍스트 파일에서 정보를 찾는 방법

grep을 사용하여 구조화된 텍스트 파일에서 정보를 찾는 방법

이 텍스트 파일에는 베스트셀러 노래가 포함되어 있습니다. 그 구조는 다음과 같습니다:

Single,Artist,Record label,Released,Chart,Traditional sales peak,

몇 가지 예시 라인은 다음과 같습니다:

Imagine,John Lennon,Apple,Oct-75,1,1714351
Uptown Funk,Mark Ronson featuring Bruno Mars,RCA,Dec-14,1,1647310
Wonderwall,Oasis,Creation,Oct-95,2,1502270

1위(5번째 필드)에 포함되지 않은 노래를 찾으려고 합니다 Wonderwall. 즉, 5번째 필드를 어떻게 지정해야 할지 모르겠습니다. 내 생각은 cat top50.txt | grep-vE "^[^*,*,*,*,[1],]".

나도 200만 판매량 노래 찾고싶다

grep하지만 특정 영역을 타겟팅하는 방법을 알아내기 전까지는 그렇게 할 수 없을 것 같습니다 .

답변1

Grep은 잘못된 도구입니다. 필드를 처리하도록 특별히 설계된 도구를 사용해야 합니다. 예를 들어 awk5번째 필드가 1보다 큰 모든 행을 얻으려면:

$ awk -F, '$5 > 1' file
Wonderwall,Oasis,Creation,Oct-95,2,1502270

또는 6번째 필드가 200만 이상입니다.

awk -F, '$6 >= 2000000' file

grep값을 비교할 수 없기 때문에 이와 같은 작업을 수행하는 것은 불가능합니다 . 당신이 할 수 있는 최선의 방법은 이와 같은 끔찍한 해킹을 수행하고 다음 행을 1다섯 번째 필드로 만드는 것입니다.

$ grep -E '([^,]+,){4}1,' file
Imagine,John Lennon,Apple,Oct-75,1,1714351
Uptown Funk,Mark Ronson featuring Bruno Mars,RCA,Dec-14,1,1647310

그리고 숫자 1이 아닌 것을 얻으려면 일치 항목을 반대로 하십시오.

$ grep -vE '([^,]+,){4}1,' file
Wonderwall,Oasis,Creation,Oct-95,2,1502270

이는 "하나 이상의 not ,( [^,]+)과 쉼표, a 1와 쉼표가 정확히 4번 반복되는 것을 찾는 것"을 의미합니다.

당신이 하려는 것은 완전히 다른 것을 찾는 것입니다. 정규식에서 [ ]문자 클래스를 나타냅니다. 따라서 [abc]" a, 또는 b, 또는 중 하나 c"를 의미하고 [^abc]"중 하나"를 의미합니다.아무것a, b, 또는 제외 c. 따라서 a , a , a , a 또는 a 이외의 문자와 동일하며 [^*,*,*,*,[1],]모든 문자와 일치합니다. 나는 당신이 다음과 같은 일을 하려고 한다고 생각합니다.[^*,[]1][]1,*

$ grep -vE '^.*?,.*?,.*?,.*?,1,' file 
Wonderwall,Oasis,Creation,Oct-95,2,1502270

The는 *"처음 0개 이상"을 의미하는 수정자입니다. 그러므로 그 자체로는 아무런 의미가 없습니다. 임의의 문자를 0번 이상 일치시키려면 .*not alone 을 사용할 수 있습니다 *. 다음으로, 단일 문자는 .*줄 끝까지 일치됩니다. 이를 "탐욕스러운 매칭"이라고 합니다. 탐욕스럽지 않은 경우 가장 긴 일치 항목이 아닌 가능한 가장 짧은 일치 항목을 찾으려면 위에서 사용한 이유 ?가 필요합니다..*?

관련 정보