如何比较两个文件,然后附加不部分匹配的行?

如何比较两个文件,然后附加不部分匹配的行?

我正在尝试比较两个文件(Extensions.txtTemp.txt)。如果有一行与Extensions.txtin不部分匹配,Temp.txt我想将缺失的行附加到Temp.txt.

Extensions.txt(非常基本,一栏):

111
1234
4321

Temp.txt:

1234/sip:[email protected]:5060  9421b96c5e   Avail   1.480
4321/sip:[email protected]:5060  e9b6b979a4   Avail   1.855

基本上,我想要做的是根据/第一列中之前的所有内容找到匹配项,如果没有匹配项,我想将不匹配的行打印到文件底部,以便它最终会像这样:

1234/sip:[email protected]:5060  9421b96c5e   Avail   1.480
4321/sip:[email protected]:5060  e9b6b979a4   Avail   1.855
111

到目前为止,我已经尝试过grep -v,但它没有产生我想要的结果,我也尝试过awk,似乎这是要走的路,但是我没有完全理解如何awk工作才能产生适当的结果。

答案1

您可以使用以下命令解析文件awk

awk -F '/' '
    FNR == NR {seen[$1] = $0; next}
    {if ($1 in seen) print seen[$1]; else missing[$1]}
    END {for (x in missing) print x}
' Temp.txt Extensions.txt

输出:

1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
111
  • 将字段分隔符设置为斜杠,-F '/'
  • FNR == NR对第一个输入文件的行执行之后的操作。我们将行seen作为键存储在关联数组中,然后转到next行。
  • 当 时,对第二个文件执行第二个操作FNR != NR。如果第一个字段匹配,我们打印存储的行,else并将该字段保存到另一个数组中missing
  • 在 处END,我们打印缺失的行。

答案2

您可以将 的内容读Extensions.txt入数组,删除部分匹配项,然后打印剩余的内容:

$ awk -F/ '
    NR==FNR {a[$1]; next} {for(i in a) if($1 ~ i) delete a[i]} END{for(i in a) print i} 1
  ' Extensions.txt Temp.txt
1234/sip:[email protected]:5060  9421b96c5e   Avail   1.480
4321/sip:[email protected]:5060  e9b6b979a4   Avail   1.855
111

答案3

使用grep+ cut

grep -xvFf <(cut -d'/' -f1 tmp) ext >> tmp

在这里,我们可以安全地grep使用tmp进程替换中的输入,因为模式会馈送并将结果tmp以附加模式写回到同一文件中;请参阅以下链接中的说明:

对子 shell 中的输入和父 shell 中的输出使用相同的文件名会发生冲突吗?

答案4

也可以使用join.

join -t"/" -a1 -e " " -o '1.1,2.1,2.2' <(awk '{ print $1"/"}' Extension.txt ) <( awk '{ print $0}' Text.txt)

相关内容