如何删除与同一文件中的单词匹配的字符串?

时间:2019-03-26 13:00:13

标签: bash shell awk sed grep

我正在寻找一个函数或脚本来读取每一行,并在同一文件中寻找重复项或匹配项,然后将其删除。

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

希望这可以更好地阐明问题。

3 个答案:

答案 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