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

标签 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:组名,如下所示

pi:1:wheel
useradmin:2:ftpshare

(等等)

对于 unix 类,这需要使用 awk 来完成。在花了无数个小时试图弄清楚之后,我想到了这个。

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

或者

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

有人可以帮我弄清楚这一点以获得正确的输入并向我解释我做错了什么吗?

最佳答案

您可以使用 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 执行此 block
  • {a[$2]=$1; next} - 创建一个关联数组 a,键为 $2,值为 $1,然后跳到下一条记录
  • $3 in a - 如果在数组 a 中找到 $3,则对第二个文件执行此 block
  • 打印 $1, $2, a[$3] 打印 field1、field2 和 a[field3]

关于regex - 在linux中使用awk进行文件比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28693584/

相关文章:

C# 正则表达式匹配,名称

javascript - 如何在每 3 位数字后添加一个逗号?

linux - Awk 在具有自定义日期格式的文件中查找日期范围内的行

awk - 如何从tsv文件中提取第一列?

bash - 如何使用AWK按某列抓取文件中的一行

c++ - std::regex_replace:分离匹配组的访问索引

regex - VIM搜索并替换: change string before replace

unix - Awk 和多文件处理可能吗?

python - 仅使用 python 正则表达式获取文本

Linux - 根据模式将文件中的长行拆分为多行