如果文件中存在反向行,则从文件中删除行的命令

如果文件中存在反向行,则从文件中删除行的命令

我可以说我有一个 csv 看起来像:

1,20
1,13
20,1

我需要删除 20,1,因为 1,20 已经在 csv 中。我的想法是逐行检查反向内容是否已在 csv 中,但我不知道如何使用 shell 脚本执行此操作。

编辑:2个相同的数字永远不会在同一行,例如,20,20永远不会出现

答案1

为了以合理的速度实现这一点,您需要某种哈希表。传统上,您会这样做awk,但任何现代脚本语言都可以这样做,包括bash其关联数组。

awk 'BEGIN{FS=","}                                                                   
{                                                                               
   rev=$NF; for(i=NF-1;i>0;i--) {rev = rev "," $i}                                                                         
   if (!seen[rev]) { print }                                                    
   seen[$0]=1                                                               
}'

这会在 rev 中构造反转线,如果尚未看到反转线,则打印该线,然后记录已看到该线。

答案2

$ cat file
4,bumblebee
1,20
1,13
20,1
20,1
20,13
bumblebee,3
13,1
bumblebee,4
$ awk -F, '!seen[$1,$2]++ && !seen[$2,$1]' file
4,bumblebee
1,20
1,13
20,13
bumblebee,3

这是使用关联数组 ,seen在其中我们计算在输入中看到一对字段的次数。

如果我们之前没有见过该对,也没有见过相反的对,则打印该行。

这并不假设字段是数字的。

答案3

假设您真正想做的只是确保某些部件组合仅出现一次,无论其顺序如何,惯用的方法是将您想要唯一的部件按特定顺序进行排序,然后检查之前是否已经看到该结果密钥。当你只有 2 个部分时,它就变成了:

$ awk -F',' '!seen[$1>$2 ? $1 FS $2 : $2 FS $1]++' file
1,20
1,13

相关内容