我的第一个文件的示例数据first.txt
如下:
10.0.0.1,Web Server,comments1,jboss is older version,myappcode1
10.0.0.3,Web Server,comments4,httpd is latest version,myappcode15
10.0.0.7,Web Server,comments5,weblogic is old version,myappcode2
10.0.0.13,App Server,comments4,jboss is old version,myappcode15
10.0.0.2,Web Server,comments3,websphere is new version,myappcode11
.....
样本数据second.txt
whatever,10.0.0.1,Web Server,date,whatever,here is JBOSS on the server,myappcode1
watever1,whatever2,10.0.0.3,here is App server,comments4,myapp17,myappcode15
whatever,10.0.0.7,check for test_WebLogic_version version,comments5,date,myappcode2
whatever,whatever,10.0.0.13,App Server,here is JBOSS,myapp17,myappcode15
whatever,whatever,whatever,10.0.0.12,Web Server,here on_windows is the latest version,whatever,
.....
要求:
我需要检查column1和第四列的第一个单词是否first.txt
存在于任何行中second.txt
因此,third.txt
应该是
10.0.0.1,Web Server,comments1,jboss is older version,myappcode1
10.0.0.7,Web Server,comments5,weblogic is old version,myappcode2
10.0.0.13,App Server,comments4,jboss is old version,myappcode15
.....
Third.txt 不应包含以下两个条目,因为:
10.0.0.13,App Server,comments4,jboss is old version,myappcode15 ----> `httpd` did not match `here is App server`
10.0.0.2,Web Server,comments3,websphere is new version,myappcode11 ----> `10.0.0.2` did not match `10.0.0.12`
以下是我所知道的,但无法以巧妙的方式将其组合在一起。
获取first.txt中的第一列和第四列的第一个单词
cat first.txt | cut -d, -f1
---> 为我们提供第一栏cat first.txt | cut -d, -f4 | awk 'NR==1{print $1}'
---> 获取第四列的第一个单词Grep 查找 Second.txt 中的第 1 列和第四列的第一个单词
cat second.txt | grep -w <first column> | grep -i 'first word of fourth column'
---> 这里需要帮助
你能建议一下吗?
答案1
这是一个 awk 脚本:
awk -F, 'FNR==NR {
row[tolower($0)]
next
}
{
split($4,arr," ")
for (r in row) {
if (r ~ tolower($1 FS) && r ~ tolower(arr[1])) {
print
next
}
}
}' second.txt first.txt
输出:
10.0.0.1,Web Server,comments1,jboss is older version,myappcode1
10.0.0.7,Web Server,comments5,weblogic is old version,myappcode2
10.0.0.13,App Server,comments4,jboss is old version,myappcode15
我们将作为键的行存储second.txt
在“行”关联数组中,然后我们将行解析first.txt
并测试所选字段到“行”中。tolower()
用于实现忽略大小写匹配。
笔记:我对上面的内容进行了修改,第一个匹配模式不再是单独的 IP,现在是$1 FS
,意思是 IP 后跟一个逗号。因为两个文件都是这种情况。如果没有它,10.0.0.1
还会匹配 for10.0.0.13
或类似的。