공통 필드가 있는 두 파일 - 다른 파일을 기준으로 한 파일을 정렬할 수 있습니까?

공통 필드가 있는 두 파일 - 다른 파일을 기준으로 한 파일을 정렬할 수 있습니까?

공통 필드가 있는 두 개의 파일이 있다고 가정해 보겠습니다. 이 파일에 있는 필드(예: 숫자 필드)를 기반으로 첫 번째 파일을 정렬하고 싶습니다. 하지만 이 재정렬이 일반 필드를 통해 다른 파일에서도 작동하도록 하고 싶습니다.

예를 들어--완전히허공에서 그것을 잡아 ;-) -- 그것을 얻자/etc/비밀번호그리고/etc/shadow:

/etc/passwd:
(...)
sshd:x:124:65534::/var/run/sshd:/usr/sbin/nologin
sndiod:x:999:29::/var/lib/sndiod:/usr/sbin/nologin
dictd:x:125:135:Dictd 서버,,,:/var/lib/dictd:/bin/false
postgres:x:126:136:PostgreSQL 관리자,,,:/var/lib/postgresql:/bin/bash
(...)
/etc/shadow:
(...)
SSHD:*:17055:0:99999:7:::
sdiod:!:17055::::::
사전:*:17055:0:99999:7:::
포스트그레스:*:17055:0:99999:7:::
(...)

종류/etc/비밀번호UID의 숫자는 간단합니다.

sort -n -t: -k3 /etc/passwd > pw

위 줄의 결과는 다음과 같습니다.

/etc/passwd:
(...)
sshd:x:124:65534::/var/run/sshd:/usr/sbin/nologin
dictd:x:125:135:Dictd 서버,,,:/var/lib/dictd:/bin/false
postgres:x:126:136:PostgreSQL 관리자,,,:/var/lib/postgresql:/bin/bash
sndiod:x:999:29::/var/lib/sndiod:/usr/sbin/nologin
(...)

하지만,/etc/shadow하다아니요나중에 정렬할 수 있는 숫자 UID 필드가 있지만... 그렇습니다./etc/비밀번호-- 사용자 이름 필드가 있습니다...

행을 다시 정렬하는 방법이 있습니까?/etc/shadow이런 방식으로 사용자 이름 필드의 순서는 다음의 사용자 이름 필드 순서와 동일합니다.숫자순으로 정렬 /etc/비밀번호?

  • sort정렬할 수 있는 명령 또는 이와 유사한 것이 있습니까 ?파일 A이 파일의 특정 키 뒤에도 정렬문서 B두 파일이 공유하는 공통 필드에 있습니까?
  • 또는 다음을 사용하여 정렬할 수 있는 적절한 2단계 프로세스(명령, sed/AWK/Perl 스크립트 또는 기타)가 있습니까?파일 A재 주문문서 B공통 영역을 지나면?

답변1

파일을 연결하고, 병합된 파일을 정렬하고, 원하지 않는 열을 제거합니다.

이 경우 field1 of는 field1 of 와 /etc/passwd연결되어 필드 구분 기호 역할을 합니다./etc/shadow:

join -t : -1 1 -2 1 /etc/passwd /etc/shadow |
sort -t : -k 3,3n |
cut -d : -f 1,8-

답변2

더 우아한 방법이 있을 수 있지만 다음은 2단계 접근 방식입니다.

for user in $(sort -n -t: -k3 /etc/passwd | cut -d: -f1)
do 
  grep ^${user}: /etc/shadow
done > /tmp/shadow.new

/etc/passwd의 각 항목에 대해 /etc/shadow를 한 번씩 읽습니다.

답변3

내 컴퓨터에서 /etc/shadow를 읽으려면 sudo가 필요합니다.

sudo awk -F: 'NR==FNR {uid[$1]=$3; next} {print uid[$1], $0}' /etc/passwd /etc/shadow |
 sort -n |
 cut -d" " -f2-

awk 스크립트는 섀도우 파일의 사용자 이름에 해당하는 passwd 파일의 uid를 공백으로 구분하여 인쇄합니다. 그런 다음 숫자별로 정렬하고 cut 명령을 통해 uid를 삭제합니다.

관련 정보