首页 > 解决方案 > 如何在 awk 命令中打印某些输出

问题描述

文件 1

area@wide.com
geo@earth.com
sun@far.com

文件2

area@wide.com:200
moon@mars.com:100
venus@distance.com:0
geo@earth.com:201
sun@far.com:10

文件 3应如下所示:

area@wide.com:200
geo@earth.com:201
sun@far.com:10

我试过了:

awk -F, 'BEGIN{OFS=":"} NR==FNR{a[$1$2]=$3;next}'

标签: awk

解决方案


awk -F: 'NR==FNR{a[$0]; next} $1 in a' file1 file2
  • -F:设置:为字段分隔符
  • NR==FNR{a[$0]; next}根据完整的行内容构建数组键file1
  • $1 in afile2如果第一个字段是数组中的键,则打印行a


看起来您的文件可能具有 dos 样式的行尾,在这种情况下您可以使用:

awk -F: 'NR==FNR{sub(/\r$/, ""); a[$0]; next} $1 in a' file1 file2

在这里,在将 in 行末尾的回车符file1用作键之前,它会被删除,因此它将匹配 的第一个字段file2。此外,输出将是 dos 样式的。

另请参阅为什么我的工具输出会覆盖自身以及如何修复它?


如果行尾有空格、制表符等空白字符,也可能导致问题。在这种情况下,使用

awk -F: 'NR==FNR{sub(/[[:space:]]*$/, ""); a[$0]; next} $1 in a' file1 file2

这将在将其用作键之前删除行尾的额外空格。这也适用于 dos 样式的文件。


推荐阅读