1

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

文件 1

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

文件2

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

您能帮我将合并的文件写入另一个文件吗?

4

2 回答 2

3

使用bash. 这给了你相当于一个完整的外连接

 join -t'$' -a 1 -a 2 <(sort -k1,1 -t'$' out1.csv ) <(sort -k1,1 -t'$' out2.csv )
于 2012-07-17T14:32:39.723 回答
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$$$$$$$$
于 2012-07-17T14:57:38.100 回答