【问题标题】:Merge two files using awk and write the output使用 awk 合并两个文件并写入输出
【发布时间】:2012-07-17 22:57:38
【问题描述】:

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

文件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比较

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

【问题讨论】:

  • 要使用连接,输入文件必须已经排序。您正在通过管道传递给sort -n,这表明它们可能没有正确排序。尝试按字典顺序(不是数字)对它们进行排序,然后使用连接,然后按数字对输出进行排序。

标签: bash awk export-to-csv


【解决方案1】:

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

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

【讨论】:

  • 是的,这是工作的问题是第一个文件行正在写入,然后第二个文件行正在写入下一行..所以列没有正确合并..因为我再次合并了这个文件我必须基于相同的第一列字段与另一个文件(out3.csv)合并..
  • Saravanan,join 命令从 2 个并排的文件中返回匹配的行。你确定你的行没有被 CRLF 字符终止?
【解决方案2】:

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$$$$$$$$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2015-11-07
    • 2020-07-07
    相关资源
    最近更新 更多