繁体   English   中英

Linux awk合并了两个文件

[英]Linux awk merge two files

我有下面的脚本来组合两个文件。

awk -F"\t" '
    {key = $1}
    !(key in result) {result[key] = $0; next;}
    { for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"    # if using GNU awk
        for (key in result) print result[key]
    }
' $1 $2 > $3 

第一列是关键,$ 1和$ 2。 但是如果$ 2列有一个键但是$ 1列没有键。

然后它除了1美元行之外还要合并。

我想结合只有1美元的钥匙存在。 我怎样才能简单地合并这两个文件?

例如,

档案1

Key    Column1  Column2  Column3  
Test1    500     400     200               
Test2    499     400     200               
Test5    600     200     150               
Test6    600     199     150               
Test7    599     199     100               

文件2

Key    Column4   Column5
Test1    Good     Good                    
Test2    Good     Good
Test3    Good     Good                    
Test4    Good     Good
Test5    Good     Good                    
Test6    Good     Good
Test7    Good     Good

目前的组合

Key    Column1  Column2  Column3  Column4   Column5
Test1    500     400     200       Good     Good     
Test2    499     400     200       Good     Good      
Test5    600     200     150       Good     Good          
Test6    600     199     150       Good     Good          
Test7    599     199     100       Good     Good  
Test3    Good    Good  
Test4    Good    Good  

预期结合。

Key    Column1  Column2  Column3  Column4   Column5
Test1    500     400     200       Good     Good     
Test2    499     400     200       Good     Good      
Test5    600     200     150       Good     Good          
Test6    600     199     150       Good     Good          
Test7    599     199     100       Good     Good 

谢谢!

你错了。 您所描述的是一个join操作,并且有一个非常好的UNIX工具,其名称非常明显:

$ join file1 file2 | column -t
Key    Column1  Column2  Column3  Column4  Column5
Test1  500      400      200      Good     Good
Test2  499      400      200      Good     Good
Test5  600      200      150      Good     Good
Test6  600      199      150      Good     Good
Test7  599      199      100      Good     Good

或者如果你坚持使用awk:

$ awk 'NR==FNR{m[$1]=$2" "$3; next} {print $0, m[$1]}' file2 file1 | column -t
Key    Column1  Column2  Column3  Column4  Column5
Test1  500      400      200      Good     Good
Test2  499      400      200      Good     Good
Test5  600      200      150      Good     Good
Test6  600      199      150      Good     Good
Test7  599      199      100      Good     Good

存储到阵列中时添加条件

{key = $1}
!(key in result) && NR == FNR {result[key] = $0; next;}
(key in result) { for (i=2; i <= NF; i++) {
    result[key] = result[key] FS $i
    }
}
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"    # if using GNU awk
    for (key in result) print result[key]
}

NR == FNR确保我们存储到result中的key来自第一个文件。 我们还添加(key in result)以确保在迭代for循环之前键存在。

您可以尝试以下命令:

awk '
    BEGIN { FS = OFS = "\t" }
    {key = $1}
    FNR == NR {result[key] = $0; next;}
    (key in result) { for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"    # if using GNU awk
        for (key in result) print result[key]
    }
' file1 file2

我改变了那些支票。 FNR == NR仅保存第一个文件的result行。 并且(key in result)适用于第二个文件,并且仅为先前在第一个文件中找到的那些键附加列。

它产生:

Key     Column1 Column2 Column3         Column4 Column5
Test1   500     400     200             Good    Good
Test2   499     400     200             Good    Good
Test5   600     200     150             Good    Good
Test6   600     199     150             Good    Good
Test7   599     199     100             Good    Good

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM