1

共通フィールドを持つ 2 つのファイルがあります。awkLinuxコマンドで2つのファイルを共通フィールドでマージし、マージされたファイルを別のファイルに書き込みたいです。

ファイル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

あなたは解決策で良い方向にいましたawkFS主なポイントは、次のようにフィールドを分割するように変更することでした$:

の内容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 に答える