我需要一个 awk 命令来合并这两个具有匹配值的文件。
Color:Green
Color:Yellow
Color:Orange
和
Green:Yes
Orange:Yes
并得到
Color:Green:Yes
Color:Orange:Yes
答案1
在 中使用join
and :sort
bash
$ join -t: -1 2 <( sort -t: -k2 colours.txt ) <( sort selected.txt )
Green:Color:Yes
Orange:Color:Yes
为了正确排序字段:
$ join -t: -1 2 -o1.1,1.2,2.2 <( sort -t: -k2 colours.txt ) <( sort selected.txt )
Color:Green:Yes
Color:Orange:Yes
join
对排序的输入数据执行关系 JOIN 操作。在本例中,连接字段是颜色,它:
在第一个文件中显示为第二个分隔字段,:
在第二个文件中显示为第一个分隔字段。
通过join -t: -1 2
make,我们join
从第一个文件中选择第二个字段作为“连接键”字段(第一个字段是默认字段),并且通过这两个字段<(...)
(在 中进行替换bash
),我们提供排序后的数据。第一个sort
是唯一“特殊”的,因为它在第二个:
分隔字段(颜色)上对第一个文件进行排序。
上面的第二个示例使用该-o
标志来显式指定我们希望在输出中看到的内容以及顺序。
答案2
这是一个awk
解决方案:
awk -F':' 'NR==FNR{seen[$1]=$2; next}
($2 in seen){print $0":"seen[$2]; next}1' file2 file1
输入:
==> file1 <== Color:Green Color:Yellow Color:Pinky Color:Orange ==> file2 <== Green:Yes Orange:Yes Yellow:No
输出:
Color:Green:Yes Color:Yellow:No Color:Pinky Color:Orange:Yes
答案3
假设 file1 是
color:green
color:yellow
color:orange
文件2是
green:yes
orange:yes
我想这会生成你想要的:
awk -F ':' 'FNR==NR{a[$1]=$2;next}($2 in a){print a[$1]":"a[$2]} file2 file1
输出:
color:green:yes
color:orange:yes