使用awk合并两个文件并写入输出

时间:2012-07-17 14:25:15

标签: bash awk export-to-csv

我有两个共同字段的文件。我想将这两个文件与common字段合并,并使用linux命令中的awk将合并后的文件写入另一个文件。

文件1

412234$name1$value1$mark1
413233$raja$$mark2
414444$$$

file2的

412234$sum$file2$address$street
413233$sum2$file32$address2$street2$path
414444$$$$

这些示例文件由$分隔,输出合并文件也在$。这些行也有空字段。

我使用join尝试了脚本:

   join -t "$" out2.csv out1.csv  |sort -un > file3.csv

但是总数不匹配发生了。

尝试awk

myawk.awk

#!/usr/bin/awk -f 
NR==FNR{a[FNR]=$0;next} {print a[FNR],$2,$3}

我跑了

awk -f myawk.awk out2.csv out1.csv > file3.csv

这也花了太多时间。没有回复。

此处out2.csv是主文件,我们必须与out1.csv

进行比较

你能帮我把合并后的文件写进另一个文件吗?

2 个答案:

答案 0 :(得分:3)

使用bash运行以下命令。这相当于一个完整的外连接

 join -t'$' -a 1 -a 2 <(sort -k1,1 -t'$' out1.csv ) <(sort -k1,1 -t'$' out2.csv )

答案 1 :(得分:1)

您使用awk解决方案的方向很好。重点是将FS更改为使用$分割字段:

script.awk的内容:

awk '
    BEGIN {
        ## Split fields with "$".
        FS = "$"
    }

    ## Save lines from second file, the first field as the index of the
    ## array, and rest of the line as the value.
    FNR == NR {
        file2[ $1 ] = substr( $0, index( $0, "$" ) )
        next
    }

    ## Print when keys from both files match.
    FNR < NR {
        if ( $1 in file2 ) {
            printf "%s$%s\n", $0, file2[ $1 ]
        }
    }
' out2.csv out1.csv

输出:

412234$name1$value1$mark1$$sum$file2$address$street
413233$raja$$mark2$$sum2$file32$address2$street2$path
414444$$$$$$$$