用于合并文件的 awk 命令

用于合并文件的 awk 命令

我需要一个 awk 命令来合并这两个具有匹配值的文件。

Color:Green
Color:Yellow 
Color:Orange

Green:Yes
Orange:Yes

并得到

 Color:Green:Yes
 Color:Orange:Yes

答案1

在 中使用joinand :sortbash

$ 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 2make,我们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

相关内容