在 linux 中使用 Awk 进行文件比较

file comparision using Awk in linux

我有两个文件 文件 A.txt(组名;组 ID)

wheel:1
www:2
ftpshare:3
others:4

文件B.txt(用户名:UserID:Groupid)

pi:1:1
useradmin:2:3
usertwo:3:3
trout:4:3
apachecri:5:2
guestthree:6:4

我需要在显示 username:userID 的地方创建一个输出:如下所示的组名

pi:1:wheel
useradmin:2:ftpshare

(以此类推)

这需要使用 awk for a unix class 来完成。在花了无数小时试图弄清楚这就是我想出的。

awk -F ':' 'NR==FNR{ if (==[a-z]) a[] = ;next} NF{ print , , }' fileA.txt fileB.txt

awk -F, 'NR==FNR{ a[]=;next } NF{ print ,  ((a[]==)?",ok":",nok") }' FileA.txt FileB.txt

谁能帮我解决这个问题以获得正确的输入并向我解释我做错了什么。

你可以使用 awk:

awk 'BEGIN{FS=OFS=":"} FNR==NR{a[]=; next}  in a{print , , a[]}' a.txt b.txt
pi:1:wheel
useradmin:2:ftpshare
usertwo:3:ftpshare
trout:4:ftpshare
apachecri:5:www
guestthree:6:others

工作原理:

  • BEGIN{FS=OFS=":"} - 将输入和输出字段分隔符设为冒号
  • FNR==NR - 仅针对 fileA
  • 执行此块
  • {a[]=; next} - 创建一个关联数组a,键为</code>,值为<code>,然后跳到下一条记录
  • in a - 如果在数组 a
  • 中找到 </code>,则对第二个文件执行此块 <li><code>print , , a[] 打印字段 1、字段 2 和 a[field3]

我知道你说你想使用 awk,但你也应该考虑为这样的任务设计的标准工具,即 join。这是您可以应用它的一种方法:

join -o '2.1 2.2 1.1' -t: -1 2 -2 3 <(sort -t: -k2,2n fileA.txt) \
                                    <(sort -t: -k3,3n fileB.txt)

因为 join 的输入需要在连接字段上排序,此方法使输出无序,如果这很重要,请使用 答案。

这种情况下的输出:

pi:1:wheel
apachecri:5:www
trout:4:ftpshare
useradmin:2:ftpshare
usertwo:3:ftpshare
guestthree:6:others