1

次のような列が1つしかない参照ファイルがあります。

file1:
a
b
c
d
e

2番目のcsvファイルには、いくつかの列があります。これらの列の最初の列には、参照ファイルに存在する値の一部があります。

file2:
a; 34; 42; 23; 45; 1
c; 3; 2; 1; 7; 8
e; 6; 2; 2; 1; 3

私が取得したいのは、file1には存在するが、file2には存在しない行を、ある列の定数値と最後の列のゼロで追加することです。

a; 34; 42; 23; 45; 1
b; cost1; cost2; cost3; cost4; 0
c; 3; 2; 1; 7; 8
d; cost1; cost2; cost3; cost4; 0
e; 6; 2; 2; 1; 3

何か助けはありますか?、

ありがとう。

4

2 に答える 2

1
awk 'BEGIN {FS = OFS = ";"} FNR == NR {arr[$1] = $0; next} ! ($1 in arr) {print $1, "cost1;cost2;cost3;cost4;0"} END {for (i in arr) {print arr[i]}}' file2 file1

出力は未定義の順序になります(すべての新しい行が最初に印刷されることを除いて)。GNU AWK(gawk)を使用していて、行を並べ替える必要がある場合は、新しい行をすぐに出力して関数を使用する代わりに、新しい行を配列に保存できますasort()。それ以外の場合は、外部sortユーティリティを使用できます。

複数の行に分かれています:

awk '
    BEGIN {
        FS = OFS = ";"
    } 
    FNR == NR {
        arr[$1] = $0; 
        next
    } 
    ! ($1 in arr) {
        print $1, "cost1;cost2;cost3;cost4;0"
    } 
    END {
        for (i in arr) {
            print arr[i]
        }
    }' file2 file1

編集:

同じフィールド1を持つfile2の複数の行に対応するには、次の行を変更します。

        arr[$1] = $0;

        arr[$1]

その直後に次の行を追加します。

        lines[$0]

次に、次の行を変更します。

        for (i in arr) {
            print arr[i]

        for (i in lines) {
            print i

編集2:

追加した行を異なる値で10回印刷するには、次のセクションを変更します。

    ! ($1 in arr) {
        print $1, "cost1;cost2;cost3;cost4;0"
    } 

    ! ($1 in arr) {
        for (i = 1; i <= 10; i++) {
            print $1, "cost1", i, "cost3;cost4;0"
        }
    } 
于 2012-07-04T11:45:10.723 に答える
0
( cat file2  ; comm -23 file1 <(cut -d';' -f1 file2) \
| sed 's/$/;cost1;cost2;cost3;cost4;0/' ) | sort

スクリプトに入れるには、次のテキストをコピーします。

( cat file2  ; comm -23 file1 <(cut -d';' -f1 file2) | sed 's/$/;cost1;cost2;cost3;cost4;0/' ) | sort

またはさらに人間バージョンに採用:

( 
    cat file2
    comm -23 file1 <(cut -d';' -f1 file2) | sed 's/$/;cost1;cost2;cost3;cost4;0/' 
) | sort
于 2012-07-04T11:44:22.797 に答える