具有公共字段的两个文件 - 是否可以根据另一个文件对一个文件进行排序?

Baa*_*rud 2 command-line shell awk text-processing sort

假设我有两个具有共同字段的文件。我想根据在此文件中找到的字段(例如数字字段)对第一个进行排序……但我希望这种重新排序也适用于另一个文件 - 通过公共字段。

举个例子 -完全凭空抓起来;-) - 让我们拿/etc/passwd/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:::
sndiod::17055::::::
字典:*:17055:0:99999:7::
postgres:*:17055:0:99999:7:::
(……)

在 UID 上按数字对/etc/passwd 进行排序很容易:

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 / passwd文件-得到了一个用户名,场...

那么有没有办法重新排序/etc/shadow 中的行,以便用户名字段与数字排序 的用户名字段具有相同的顺序/etc/passwd

  • 是否有一个命令——sort或类似的东西——可以在该文件中的某个键之后对文件 A进行排序,并同时在两个文件共享的公共字段上对文件 B进行排序?
  • 或者,是否有合适的两步过程——一个命令、一个 sed/AWK/Perl 脚本或其他东西——可以使用排序的文件 A在它们的公共字段之后重新排序文件 B

Gil*_*il' 5

加入文件,对合并后的文件进行排序,然后去掉不需要的列。

在这种情况下,字段 1 of/etc/passwd将与字段 1 连接/etc/shadow:作为字段分隔符。

join -t : -1 1 -2 1 /etc/passwd /etc/shadow |
sort -t : -k 3,3n |
cut -d : -f 1,8-
Run Code Online (Sandbox Code Playgroud)