1

我有一个参考文件,其中只有一列,如下所示:

文件 1:
a
b
c
d
e

在第二个 csv 文件中,我有几列。在这些列的第一列中,参考文件中存在一些值:

文件 2:
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

编辑:

要在 file2 中容纳具有相同字段 1 的多行,请更改此行:

        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 回答