我正在尝试比较两个文件(Extensions.txt
和Temp.txt
)。如果有一行与Extensions.txt
in不部分匹配,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
以附加模式写回到同一文件中;请参阅以下链接中的说明:
答案4
也可以使用join
.
join -t"/" -a1 -e " " -o '1.1,2.1,2.2' <(awk '{ print $1"/"}' Extension.txt ) <( awk '{ print $0}' Text.txt)