첫 번째 파일의 정보가 두 번째 파일에서 제거되도록 두 파일을 비교하려면 어떻게 해야 합니까? [복사]

첫 번째 파일의 정보가 두 번째 파일에서 제거되도록 두 파일을 비교하려면 어떻게 해야 합니까? [복사]

기본적으로 약 90개의 사용자 이름이 포함된 파일이 있습니다.

나는 총 300줄 길이의 passwd 파일에서 이러한 사용자 이름을 모두 제거해야 했습니다.

최소한 중복된 사용자 이름을 필터링하고 유지해야 하는 사용자 이름을 인쇄하는 방법을 찾으려고 노력했지만 성공하지 못했습니다.

삭제하려는 사용자 이름 90개가 포함된 파일에 다음이 포함되어 있다고 가정해 보겠습니다.

파일.txt

user1
user2
user3
user4

passwd 파일에는 이러한 사용자 이름과 기타 정보가 포함되어 있습니다.

비밀번호

user31
user32
user1
user23
user2
user4
user15
user3

passwd 파일의 사용자 이름은 파일 내에서 무작위로 배포되므로 diff -y이 작업은 수행되지 않습니다.

내 목표는 cat file.txt라는 두 파일을 비교하고 출력을 사용하여 passwd 내에서 검색하는 것입니다. 결과는 중복된 줄을 제거하거나 고유한 줄을 인쇄하는 것입니다.

답변1

comm명령은 두 개의 정렬된 파일을 비교하고 대조하는 데 사용할 수 있습니다.

comm <(sort file.txt) <(cut -d: -f1 /etc/passwd | sort)
  • 첫 번째 열에는 두 번째 파일에 나타나지 않는 첫 번째 파일의 줄이 포함되어 있습니다.
  • 두 번째 열에는 첫 번째 파일에 나타나지 않는 두 번째 파일의 줄이 포함되어 있습니다.
  • 세 번째 열에는 두 파일 모두에 나타나는 줄이 포함되어 있습니다.

3열 출력에서 ​​하나 또는 두 개의 열을 생략할 수 있습니다( comm -13 ...예를 들어 열 1과 3은 생략됩니다).


귀하의 질문에는 묻지 않았지만 후속 명령에서 사용자 이름 목록을 가져오고 해당 항목을 추출하는 방법을 요청했습니다 /etc/passwd.

( echo root; echo sys ) | sed -r 's!(.*)!^\1:!' | grep -f - /etc/passwd
root:x:0:0:root:/root:/bin/bash
sys:x:3:3:sys:/dev:/usr/sbin/nologin

답변2

가장 간단한 방법은 다음과 같습니다.

grep -v -x -f file_infotodelete reference_file  > result_file  

답변3

이를 달성하려면 아래 awk oneliner를 사용하세요.

다음 명령은 passwd 파일에서 file.txt의 내용을 삭제합니다. 테스트해 보았는데 아주 잘 작동했습니다

awk 'NR==FNR{a[$1];next}!($1 in a){print $1}' file.txt passwd

관련 정보