基于子字符串后缀从文件中删除重复条目

时间:2014-02-18 11:51:14

标签: bash shell

假设我在文件中有以下文字:

foo.bar.baz
bar.baz
123.foo.bar.baz
pqr.abc.def
xyz.abc.def
abc.def.ghi.jkl
def.ghi.jkl

如何根据后缀修复文件中的重复项?没有重复的预期输出将是:

bar.baz
pqr.abc.def
xyz.abc.def
def.ghi.jkl

(考虑foo.bar.bazbar.baz。后者是子字符串后缀,因此只剩下bar.baz。但pqr.abc.defxyz.abc.def都不是子字符串彼此的后缀,所以两者都保留。)

2 个答案:

答案 0 :(得分:2)

试试这个:

#!/bin/bash

INPUT_FILE="$1"

in="$(cat $INPUT_FILE)"
out="$in"

for line in $in; do
  out=$(echo "$out" | grep -v "\.$line\$")
done

echo "$out"

您需要将其保存到脚本(例如bashor.sh),使其可执行(chmod +x bashor.sh)并使用您的输入文件作为第一个参数调用它:

./bashor.sh path/to/input.txt

答案 1 :(得分:0)

使用sed转义正则表达式的字符串,前缀.,后缀$并将其传递给GNU grep(-f -不适用于BSD grep,例如,在Mac上。)

sed 's/[^-A-Za-z0-9_]/\\&/g; s/^/./; s/$/$/' test.txt |grep -vf - test.txt

我刚刚习惯regular expression escaping from another answer,并没有想到它是否合理。乍一看似乎很好,但逃避太多,虽然这可能不是问题。