我可以说我有一个 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