所以我有两个文件。
文件1内容的示例。
/n01/mysqldata1/mysql-bin.000001
/n01/mysqldata1/mysql-bin.000002
/n01/mysqldata1/mysql-bin.000003
/n01/mysqldata1/mysql-bin.000004
/n01/mysqldata1/mysql-bin.000005
/n01/mysqldata1/mysql-bin.000006
文件2内容的示例。
/n01/mysqlarch1/mysql-bin.000004
/n01/mysqlarch1/mysql-bin.000001
/n01/mysqlarch2/mysql-bin.000005
所以我想只根据mysql-bin.00000X而不是每个文件中的其余文件路径进行匹配,因为它们在file1和file2之间不同。
这是我正在尝试运行的命令
cat file1 | egrep -v file2
我希望这里的输出是......
/n01/mysqldata1/mysql-bin.000002
/n01/mysqldata1/mysql-bin.000003
/n01/mysqldata1/mysql-bin.000006
非常感谢任何帮助。
答案 0 :(得分:3)
根据/
:
$ awk -F/ 'FNR==NR {a[$NF]; next} !($NF in a)' f2 f1
/n01/mysqldata1/mysql-bin.000002
/n01/mysqldata1/mysql-bin.000003
/n01/mysqldata1/mysql-bin.000006
这将读取内存中的file2,然后与file1进行比较。
-F/
将字段分隔符设置为/
。FNR==NR {a[$NF]; next}
在读取第一个文件(file2)时,将每个最后一个文件存储到数组a[]
中。由于我们将字段分隔符设置为/
,因此这是mysql-bin.00000X
部分。!($NF in a)
在读取第二个文件(file1)时,检查最后一个字段(mysql-bin.00000X
部分)是否在数组a[]
中。如果没有,请打印该行。我遇到了一个在测试时已经注意到的问题。如果file2是 没有任何东西可以返回,就像我期望的那样 在file1中返回。这是你可以帮助我的东西吗? 请? - user2841861。
然后问题是FNR==NR
在读取第二个文件时匹配。为了防止这种情况,只需交叉检查第一个文件中的“读入[]数组”操作:
awk -F/ 'FNR==NR && argv[1]==FILENAME {a[$NF]; next} !($NF in a)' f2 f1
^^^^^^^^^^^^^^^^^^^^
来自man awk
:
<强> ARGV 强>
awk程序可用的命令行参数存储在 数组称为ARGV。 ARGC是命令行参数的数量 当下。请参见其他命令行参数一节。不像大多数awk 数组,ARGV从零索引到ARGC - 1