일부 사용자를 나열하는 파일이 있습니다. 즉, 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