删除 "almost similar" 字符串的冗余行
Remove redundancy lines for "almost similar" strings
我有以下文件:
ab=5
ac=6
ad=5
ba=5
bc=7
bd=4
ca=5
cb=7
cd=3
...
"ab"和"ba"、"ac"和"ca"、"bc"和"cb"是多余的。
如何消除 bash 中的这些冗余行?
预期输出:
ab=5
ac=6
ad=5
bc=7
bd=4
cd=3
能否请您尝试关注并告诉我这是否对您有帮助,我已经使用 GNU awk
编写并测试了它。
awk -F'=' '{
split(,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
短awk
解法:
awk '{ c1=substr([=10=],1,1); c2=substr([=10=],2,1) }!a[c1 c2]++ && !((c2 c1) in a)' file
c1=substr([=13=],1,1)
- 将提取的第一个字符分配给变量 c1
c2=substr([=15=],2,1)
- 将提取的第二个字符分配给变量 c2
!a[c1 c2]++ && !((c2 c1) in a)
- 基于 "similar" 2 字符序列 之间互斥的关键条件
输出:
ab=5
ac=6
ad=5
bc=7
bd=4
cd=3
$ awk '{x=substr([=10=],1,1); y=substr([=10=],2,1)} !seen[x>y?x y:y x]++' file
ab=5
ac=6
ad=5
bc=7
bd=4
cd=3
这是一个 perl
的通用解决方案,与 =
之前的字符数无关
$ 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
进行就地编辑
我有以下文件:
ab=5
ac=6
ad=5
ba=5
bc=7
bd=4
ca=5
cb=7
cd=3
...
"ab"和"ba"、"ac"和"ca"、"bc"和"cb"是多余的。 如何消除 bash 中的这些冗余行?
预期输出:
ab=5
ac=6
ad=5
bc=7
bd=4
cd=3
能否请您尝试关注并告诉我这是否对您有帮助,我已经使用 GNU awk
编写并测试了它。
awk -F'=' '{
split(,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
短awk
解法:
awk '{ c1=substr([=10=],1,1); c2=substr([=10=],2,1) }!a[c1 c2]++ && !((c2 c1) in a)' file
c1=substr([=13=],1,1)
- 将提取的第一个字符分配给变量c1
c2=substr([=15=],2,1)
- 将提取的第二个字符分配给变量c2
!a[c1 c2]++ && !((c2 c1) in a)
- 基于 "similar" 2 字符序列 之间互斥的关键条件
输出:
ab=5
ac=6
ad=5
bc=7
bd=4
cd=3
$ awk '{x=substr([=10=],1,1); y=substr([=10=],2,1)} !seen[x>y?x y:y x]++' file
ab=5
ac=6
ad=5
bc=7
bd=4
cd=3
这是一个 perl
的通用解决方案,与 =
$ 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
进行就地编辑