给出以下两行:
foo1 foo2 foo3 foo4
foo3 foo4 foo1 foo2
第2行是重复的,因为它的第1列和第2列等于第1行的第3列和第4列。
使用awk删除第二行的最短路径是什么?
答案 0 :(得分:0)
这似乎有效,但请自行检查:
cat <<EOF >file1
foo1 foo2 foo3 foo4
foo3 foo4 foo1 foo2
foo2 foo1 foo3 foo4
fooA fooB fooC fooD
fooC fooD fooA fooB
fooD fooC fooA fooB
fooD fooB fooC fooA
EOF
awk '!f1[$1$2$3$4]++ && !f1[$3$4$1$2]++' file1
#Output
foo1 foo2 foo3 foo4
foo2 foo1 foo3 foo4
fooA fooB fooC fooD
fooD fooC fooA fooB
fooD fooB fooC fooA
编辑:
正如评论所指出的,为了避免可能不需要的字段连接并避免foob ar
和foo bar
字段之间的混淆,最好使用字段分隔符FS(无论此FS设置的值是什么 - 空间默认情况下)作为数组indeces的一部分:
awk '!f1[$1FS$2FS$3FS$4]++ && !f1[$3FS$4FS$1FS$2]++' file1
答案 1 :(得分:0)
每个组合使用1个数组元素而不是2个(对于大文件很重要):
$ awk '{r=$3FS$4FS$1FS$2} !seen[$0>r?$0:r]++' file
foo1 foo2 foo3 foo4
以上假设您没有任何前导/尾随/中间空白,而您的FS是一个简单的字符串,就像默认值一样。