首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk:删除可交换字位置的重复行

awk:删除可交换字位置的重复行
EN

Stack Overflow用户
提问于 2017-03-10 23:25:04
回答 1查看 58关注 0票数 0

一般是,我的问题是如何使用删除文件中重复的行,这里的“复制”包括某些列是可交换的的情况。

我的问题的背景。最初,我有这样一个文件:

代码语言:javascript
复制
10/13-01:55:42.549318  [**] [1:1000003:0] Detect possible CnC comu [**] [Classification: Misc activity] [Priority: 3] {TCP} 10.0.0.3:1045 -> 103.105.0.1:80
10/13-01:55:42.549318  [**] [1:1000003:0] Detect possible CnC comu [**] [Classification: Misc activity] [Priority: 3] {TCP} 103.105.0.1:80 -> 10.0.0.3:1045
10/13-01:56:45.221877  [**] [1:1000003:0] Detect possible CnC comu [**] [Classification: Misc activity] [Priority: 3] {TCP} 10.0.0.3:1049 -> 103.105.0.1:80
10/13-01:56:57.150985  [**] [1:1000003:0] Detect possible CnC comu [**] [Classification: Misc activity] [Priority: 3] {TCP} 10.0.0.3:1051 -> 103.105.0.1:80
10/13-01:56:58.935176  [**] [1:1000003:0] Detect possible CnC comu [**] [Classification: Misc activity] [Priority: 3] {TCP} 10.0.0.3:1051 -> 103.105.0.1:80
10/13-01:57:13.494148  [**] [1:1000003:0] Detect possible CnC comu [**] [Classification: Misc activity] [Priority: 3] {TCP} 10.0.0.3:1054 -> 103.105.0.1:80

我的目标是达到以下格式化文件:

代码语言:javascript
复制
10.0.0.3|1045|103.105.0.1|80|CnC
10.0.0.3|1049|103.105.0.1|80|CnC
10.0.0.3|1051|103.105.0.1|80|CnC
10.0.0.3|1054|103.105.0.1|80|CnC

到目前为止,的努力和进步----我使用了以下(编写得非常糟糕)来处理它:

代码语言:javascript
复制
cat test.log | awk -F" " '{print $6 " " $15 " " $17}' | awk '{t = $1; $1 = $2; $2 = $3; $3 = t; print;}' | awk '{gsub(":", "| "); gsub(" ","|"); print}' | awk 'NR%2!=0'

然后,我有一个包含以下示例的文件:

代码语言:javascript
复制
10.0.0.3|1045|103.105.0.1|80|CnC
10.0.0.3|1049|103.105.0.1|80|CnC
10.0.0.3|1051|103.105.0.1|80|CnC
10.0.0.3|1051|103.105.0.1|80|CnC
10.0.0.3|1054|103.105.0.1|80|CnC
103.105.0.1|80|10.0.0.3|1045|CnC

第一行和最后一行被认为是复制的,因为它们匹配以下模式

代码语言:javascript
复制
A|a|B|b|M
B|b|A|a|M

寻求帮助,,我想知道是否有使用AWK,我可以在一个相对较大的文件中删除这样重复的行,而不需要我的后处理?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-11 12:36:12

也许您可以跳过这一步,只处理原始数据:

代码语言:javascript
复制
#!/usr/bin/awk -f

BEGIN{ OFS = "|" }

{
    ip1 = $(NF-2)
    ip2 = $NF
}

!(key1[ip1,ip2] + key1[ip2,ip1]){

    split(ip1,combo1,":")
    split(ip2,combo2,":")

    key1[ip1,ip2]++
    key1[ip2,ip1]++

    print combo1[1],combo1[2],combo2[1],combo2[2],$6
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42729385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档