파일 확인 - 한 줄씩 기준 일치

파일 확인 - 한 줄씩 기준 일치

일부 사용자를 나열하는 파일이 있습니다. 즉, alluser.list다음과 같습니다.

 user1
 user4
 user2
 user4
 user5
 user3
 user2

다음 이름 을 가진 또 다른 것이 있습니다 userbanned.list.

 user5
 user4
 user2

alluser.list이제 파일을 처리하고 비교하여 userbanned.list일치하는 경우 줄 끝에 True/False 같은 플래그를 추가하는 간단한 방법을 찾고 있습니다 .

결과는 다음과 같아야 합니다.

 user1 FALSE
 user4 TRUE
 user2 TRUE
 user4 TRUE
 user5 TRUE
 user3 FALSE
 user2 TRUE

답변1

사용 awk;

$ awk 'NR==FNR{ seen[$0]++;next } 
    { print $0 (($0 in seen)?" TRUE":" FALSE")}' userbanned.list alluser.list
user1 FALSE
user4 TRUE
user2 TRUE
user4 TRUE
user5 TRUE
user3 FALSE
user2 TRUE

awk분해:

NR==FNR - 첫 번째 파일 "userbanned.list"에 대해서만 다음 블록을 실행합니다.

see[$0]++ - 키 '$0'(전체 행)을 사용하여 연관 배열을 생성합니다.
             파일 "userbanned.list"

다음 - "userbanned.list" 파일의 다음 줄을 계속해서 읽습니다.

print $0 - "alluser.list" 파일의 전체 줄을 인쇄합니다. 이제 FNR은 1로 재설정됩니다.
             awk는 다음 파일을 읽지만 NR은 마지막 파일까지 계속 증가하므로
             마지막으로 읽은 파일의 줄입니다.

(($0 참조)?" TRUE":" FALSE")
           - 이를 삼항 연산자 '(조건)?"If-True":"If-False"'라고 합니다. 그것은
             if/else/의 약식이며 "alluser.list" 파일의 현재 줄이 있는지 확인합니다.
             배열에 존재하면 "TRUE"를 인쇄하고, 그렇지 않으면 "FALSE"를 인쇄합니다.

또한 중복된 사용자가 있어 해당 사용자가 두 번 이상 인쇄되는 것을 확인했습니다. 두 파일의 행을 고유하게 지정하고 awk다음과 같이 전달할 수 있습니다.

$ awk 'NR==FNR{ seen[$0]++;next } { print $0 (($0 in seen)?" TRUE":" FALSE")}
    ' <(sort -u userbanned.list) <(sort -u alluser.list)
user1 FALSE
user2 TRUE
user3 FALSE
user4 TRUE
user5 TRUE

관련 정보