共通フィールドを持つ2つのファイル - 別のファイルに基づいてファイルを並べ替えることはできますか?

共通フィールドを持つ2つのファイル - 別のファイルに基づいてファイルを並べ替えることはできますか?

共通フィールドを持つ2つのファイルがあるとします。このファイル内のフィールド(たとえば、数値フィールド)に基づいて最初のファイルをソートしたいと思います。しかし、この並べ替えが通常のフィールドを介して他のファイルでも機能するようにしたいと思います。

例えば--完全虚空でそれをつかむ;-) - それを得る/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を削除します。

関連情報