比较File中的column1和File2中的column1,输出文件2中不存在的{Column1 File1}

时间:2017-08-02 06:00:09

标签: bash shell unix awk

以下是我的文件1内容:

<?php

    $servername = "localhost";
    $username = "root";
    $password = "*****";
    $dbname = "clock";

    $conn = new mysqli($servername, $username, $password, $dbname);

    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 

    if(isset($_POST['submit'])){

        $stmt = $conn->prepare("INSERT INTO input(value) VALUES (?)");
        $stmt->bind_param('s',$_POST['value']);

       //The argument may be one of four types:

            //i - integer
            //d - double
            //s - string
            //b - BLOB
            //change it by respectively

        if ($stmt->execute() == TRUE && $stmt->affected_rows>0) {
            echo "New record created successfully";
        } else {
            echo "Error: <br>" . $conn->error;
        }
    }

    $conn->close();

?>

这是我的文件2内容

123|yid|def|
456|kks|jkl|
789|mno|vsasd|

我想在基于文件2的文件1中比较的唯一内容是第1列。根据上面的文件,输出应该只输出:

123|abc|def|
456|ghi|jkl|
789|mno|pqr|
134|rst|uvw|

行到行比较不是答案,因为第2列和第3列都包含不同的内容,但只有第1列在两个文件中包含完全相同的内容。

我怎样才能做到这一点?

目前我在我的代码中使用它:

134|rst|uvw|

2 个答案:

答案 0 :(得分:4)

您可以非常轻松地在Awk执行此操作!

awk 'BEGIN{FS=OFS="|"}FNR==NR{unique[$1]; next}!($1 in unique)' file1 file2

Awk一次处理输入行一个。并且Awk提供了一些特殊条款,BEGIN{}END{},其中包含要在处理文件之前和之后运行的操作。

因此,在文件处理发生之前设置了部分BEGIN{FS=OFS="|"}FSOFSAwk中的特殊变量,代表输入和输出字段分隔符。由于您提供的文件已被|解除限制,因此您需要设置FS="|"并使用|将其打印回来进行解析,因此请设置OFS="|" < / p>

命令的主要部分出现在BEGIN子句之后,部分FNR==NR用于处理命令中提供的第一个文件参数,因为FNR跟踪行号对于两个文件合并,NR仅用于当前文件。因此,对于第一个文件中的每个$1,将值散列到名为unique的数组中,然后当下一个文件处理发生时,部分!($1 in unique)将将这些行放在第二个文件中,其$1值不是散列数组。

答案 1 :(得分:1)

这是另一个使用joinsortgrep

的班轮
join -t"|" -j 1 -a 2 <(sort -t"|" -k1,1 file1) <(sort -t"|" -k1,1 file2) |\
   grep -E -v '.*\|.*\|.*\|.*\|'

join在这做两件事。它将来自两个文件的所有行与匹配键配对,并使用-a 2选项打印来自file2的不匹配行。

由于join要求对输入文件进行排序,我们会对它们进行排序。

最后,grep将从输出中删除包含三个以上字段的所有行。