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

awk:删除字位置可交换的重复行,awk,Awk,通常,我的问题是使用AWK如何删除文件中的重复行,这里的“重复”包括某些列可交换的情况 我的问题的背景。最初我有一个这样的文件: 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 [**

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

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

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
我的目标是实现以下格式化文件:

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
迄今为止的努力和进展我使用了以下方法(写得非常糟糕)来处理它:

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'
然后我有一个包含以下示例的文件:

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
第一行和最后一行被认为是重复的,因为它们匹配以下模式

A|a|B|b|M
B|b|A|a|M

寻求帮助我想知道是否有其他方法可以使用AWK从原始格式中删除相对较大文件中的重复行,而无需后期处理?谢谢

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

#!/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
}

欢迎来到StackOverflow!你的问题的答案是“是的,有办法”。请看一看关于改进此问题的提示。特别是,它需要包含用于解决问题的代码。除了Ed之外,我们不是免费工作的短期程序员,我们是一个互相帮助改进工艺的社区。veritas,您已将问题标记为“awk”,但您的问题中未包含任何awk代码。请添加到目前为止您的工作。谢谢,格雷厄姆和戈蒂。我对awk不熟悉,我已经在上面的问题中添加了一些背景知识。@EdMorton抱歉,我对awk不熟悉。从零开始处理这件事太好了,我会花更多的时间来学习如何去做,而不是直接寻求帮助:——)@EdMorton我真的很感谢你的帮助,并试图投票支持你的答案,尽管我的声誉等级阻止了我这么做。我的原始帖子会在几个小时内更新,以根据我的问题提供更详细的背景信息,以便更好地帮助社区,也符合社区用户的要求。诚恳地说,Grail的答案和你的答案对像我这样的初学者都很有帮助,我发现其他人可能会觉得Grail的答案更直接。再次感谢您的及时回复和友好帮助,我将尽快投票支持您的答案。:)您的第二个
key1[ip1,ip2]++
应该是
key1[ip2,ip1]++
,但在任何情况下,您都应该习惯性地使用:
!看到的是[ip1>ip2?ip1 FS ip2:ip2 FS ip1]+{…}
而不是
!(key1[ip1,ip2]+key1[ip2,ip1]){…}
因此,您不需要为每一对设置2个数组条目,也不需要单独的步骤来增加它们,而且每个人都知道当他们看到名为
seen[]
的数组时它的确切用途,这有助于澄清代码。