删除“几乎相似”字符串的冗余行

时间:2017-12-30 08:53:26

标签: bash awk unique text-processing redundancy

我有以下文件:

person
- id (PK)
- name

score
- id (PK)
- person_id (FK)
- bmi
- weight

“ab”和“ba”,“ac”和“ca”,“bc”和“cb”是多余的。 如何在bash中消除这些冗余行?

预期产出:

ab=5
ac=6
ad=5
ba=5
bc=7
bd=4
ca=5
cb=7
cd=3
...

4 个答案:

答案 0 :(得分:2)

$ awk '{x=substr($0,1,1); y=substr($0,2,1)} !seen[x>y?x y:y x]++' file
ab=5
ac=6
ad=5
bc=7
bd=4
cd=3

答案 1 :(得分:1)

awk 解决方案:

awk '{ c1=substr($0,1,1); c2=substr($0,2,1) }!a[c1 c2]++ && !((c2 c1) in a)' file
  • c1=substr($0,1,1) - 将提取的第一个字符分配给变量c1
  • c2=substr($0,2,1) - 将提取的第二个字符分配给变量c2
  • !a[c1 c2]++ && !((c2 c1) in a) - 基于互相排斥的关键条件"类似" 2个字符的序列

输出:

ab=5
ac=6
ad=5
bc=7
bd=4
cd=3

答案 2 :(得分:1)

这是perl的{​​{1}}通用解决方案,不论=之前的字符数是多少

$ cat ip.txt
ab=5
ac=6
abd=51
ba=5
bad=23
bc=7
bd=4
ca=5
cb=7
cd=3

$ perl -F= -lane 'print if !$seen{join "",sort split//,$F[0]}++' ip.txt
ab=5
ac=6
abd=51
bc=7
bd=4
cd=3
  • awk类似,默认情况下,未初始化的变量评估为false
  • -F=使用=作为字段分隔符,结果保存在@F数组
  • $F[0]会给出第一个字段,即=
  • 之前的字符
  • split//,$F[0]将为数组提供单个字符
  • sort默认情况下会进行字符串排序
  • 然后,
  • join ""将从已排序的字符中形成单个字符串,并将空字符串作为分隔符
  • 有关-lane-F选项的文档,请参阅https://perldoc.perl.org/perlrun.html#Command-Switches。使用-i进行就地编辑

答案 3 :(得分:0)

请您试着跟随并告诉我这是否对您有所帮助,我已经使用GNU awk编写并测试了它。

awk -F'=' '{
split($1,array,"")}
!((array[1],array[2]) in a){
  a[array[1],array[2]];
  a[array[2],array[1]];
  print;
  next
}
!((array[2],array[1]) in a){
  a[array[1],array[2]];
  a[array[2],array[1]];
  print;
}
'   Input_file

输出如下。

ab=5
ac=6
ad=5
bc=7
bd=4
cd=3