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

时间:2015-02-24 10:41:05

标签: regex awk

我有两个文件 文件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

我需要创建一个输出,其中显示用户名:userID:Groupname,如下所示

pi:1:wheel
useradmin:2:ftpshare

(依此类推)

这需要使用awk来完成unix类。花了无数小时试图弄明白这就是我想出来的。

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

OR

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用awk:

awk 'BEGIN{FS=OFS=":"} FNR==NR{a[$2]=$1; next} $3 in a{print $1, $2, a[$3]}' 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[$2]=$1; next} - 创建关键数组a,关键字为$2,值为$1,然后跳至下一条记录
  • $3 in a - 如果在数组$3中找到a
  • ,则对第二个文件执行此块
  • print $1, $2, a[$3]打印字段1,字段2和a[field3]

答案 1 :(得分:0)

我知道您说要使用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的输入需要在join-field上排序,所以此方法会使输出无序,如果这很重要,请使用anubhava's answer。

在这种情况下输出:

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