我正在寻找一个函数或脚本来读取每一行,并在同一文件中寻找重复项或匹配项,然后将其删除。
uniq -u函数完成一半的工作。我试图用一阵子读grep。某些方法是如何工作的,但由于某种原因,它会输出两倍于所要查找的字符串。
这是我现在用来识别匹配单词的代码。我还没有拿出代码来删除匹配的单词,但是我很可能会使用sed
filename=$1
while read line; do
grep "$line" $filename
done < $filename
这是我拥有的文件
JonasB/JB
AZ
LeylaS/LS
JB
AmeliaZ/AZ
预期结果应该是:
JonasB/"JB"
"AZ"
LeylaS/LS
"JB"
AmeliaZ/"AZ"
但是我得到的结果是:
JonasB/"JB"
"AZ"
AmeliaZ/"AZ"
"LeylaS/LS"
JonasB/"JB"
"JB"
"AmeliaZ/AZ"
我希望此脚本的结果是:
LeylaS / LS
澄清
前面的示例带来了一些混乱,对此我深表歉意。
这是另一个示例:
ecar/ElectricCar/EV
ElectricCar
EV/ecar
Car/ICE
Van
Hybrid
Truck/Van/MiniVan/BigCar
ElectricVan/ElectricTruck
因此FS为/
。
第2行和第3行应删除,因为它们与第1行的字段匹配
第5行应与第7行一起删除,因为它与第二个字段匹配
我期望的输出是:
Car/ICE
Hybrid
ElectricVan/ElectricTruck
希望这可以更好地阐明问题。
答案 0 :(得分:0)
改为使用awk。
BEGIN { FS = "/" } # / is field separator.
($NF in a) { # if last field is in a;
delete a[$NF] # delete it,
next
} { # otherwise;
a[$NF] = $0 # add it to a.
} END { # at the end;
for (b in a) # print everything in a.
print a[b]
}
调用:
awk -F '/' '($NF in a){delete a[$NF];next} {a[$NF]=$0} END{for(b in a) print a[b]}' file
答案 1 :(得分:0)
尝试一下:
nl -nrz -w6 -s " " "$filename" | sort -k2 | uniq -s7 | sort -n | cut -c8-
nl 为行编号(6位1空格,最多1 mio行)。 sort 从第2部分开始排序(忽略行号)。 唯一会删除忽略7个字符(行号)的重复项。 排序按原始顺序排序。最后,剪切删除行号。
答案 2 :(得分:0)
在gnu sed上尝试
sed -nE 'G; /^([[:print:]]+\n)(.+\n)*\1/b; h;P' filename