1

我有两个文件,但其中的数据格式和空格字符不同。我想比较这两个文件,如果 file1 中每一行的前三列与 file2 相似,我想从 file2 中删除这些行并将 file2 的其余部分保存在 file2 中。
例如:

file1:
4775.00 5215.28 23.9655 7   2.54766 
4568.06 5611.74 22.0619 56  2.36560 

file2:

6944.69 5605.22 22.6416       44 2.31929 0.914626
1619.15 5597.93 23.7979       12 2.38169 0.684619
5986.66 5599.89 23.8822        6 2.99171 0.384949
4568.06 5611.74 22.0619       56 2.36560 0.973764
1365.00 5601.16 23.3325       15 3.78138 0.212834
1787.81 5209.01 23.4643        8 3.34705 0.486087
5287.90 5244.40 21.9990      104 5.28082 0.000269982
4775.00 5215.28 23.9655        7 2.54766 0.467107
9024.54 5235.34 21.0784      120 3.13061 0.0357055

干杯。

4

1 回答 1

0

我会在需要时转发这个。同时这里有一个解决方案:

#!/usr/bin/awk -f

FNR == NR {
    a[$1] = NR
    b[$2] = NR
    c[$3] = NR
    next
}
$1 in a {
    t = a[$1]
    if (b[$2] == t && c[$3] == t) {
        next
    }
}
{
    r[++i] = $0
}
END {
    for (j = 1; j <= i; ++j) {
        print r[j] > ARGV[2]
    }
}

警告:它会根据需要直接修改文件。

用法:

awk -f script.awk file1 file2

示例结果:

6944.69 5605.22 22.6416       44 2.31929 0.914626
1619.15 5597.93 23.7979       12 2.38169 0.684619
5986.66 5599.89 23.8822        6 2.99171 0.384949
1365.00 5601.16 23.3325       15 3.78138 0.212834
1787.81 5209.01 23.4643        8 3.34705 0.486087
5287.90 5244.40 21.9990      104 5.28082 0.000269982
9024.54 5235.34 21.0784      120 3.13061 0.0357055

如果您不想直接修改第二个文件,请不要在最后一部分使用重定向:

END {
    for (j = 1; j <= i; ++j) {
        print r[j]
    }
}
于 2013-09-24T16:06:19.057 回答