如何删除一个文件中一行的三个组件与另一个文件类似的行?

时间:2013-09-24 15:34:26

标签: bash

我有两个文件,但其中的数据和空格字符的格式不同。  我想比较这两个文件,如果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

干杯。

1 个答案:

答案 0 :(得分: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]
    }
}