我有两个文件 文件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
有人可以帮我解决这个问题,以获得正确的输入并向我解释我做错了什么。
答案 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