删除具有冗余字符串的行

删除具有冗余字符串的行

我想检查文件中的特定模式/字符串,如果它存在于所有列中,我想删除相应的行。

例子:

name1   name2   name3   name1   name1   name2   name3
name1   name2   name3   name1   name2   name1   
name2   name1   name1   name2   name3   name1   
name2   name2   name2   name2   name2   

在此文件中,我想删除第 4 行,因为它的所有列都包含相同的名称。

我有一个巨大的文件,并且无法在 awk 或 grep 中手动定义列数。

答案1

awk

awk 'NF>1 { for(i=2; i<=NF; i++) if($i != $1) { print; next } } NF<=1' file

使用 GNUsed或最近的 BSD sed

sed -E '/^[ \t]*([^ \t]+)([ \t]+\1)+[ \t]*$/d' file

答案2

perl

$ perl -lane '(@a) = /$F[0]/g; print if $#F != $#a' file 
name1   name2   name3   name1   name1   name2   name3
name1   name2   name3   name1   name2   name1   
name2   name1   name1   name2   name3   name1   
  • 按空格分割输入行
  • 如果第一列用作模式时字段数与匹配数相同,则不打印该行


如果grep文件每列后始终具有相同数量的空格:

$ grep -vxE '(\S+\s+)\1*' file 
name1   name2   name3   name1   name1   name2   name3
name1   name2   name3   name1   name2   name1   
name2   name1   name1   name2   name3   name1   


笔记:如果单列线应该是输出的一部分,请使用

perl -lane '(@a) = /$F[0]/g; print if $#F != $#a || $#F == 0' file 

grep -vxE '(\S+\s+)\1+' file 

答案3

在 perl 中执行此操作的另一种方法可能是将字段映射到哈希中,然后通过在标量上下文中评估它们来计算结果键,例如

$ perl -ane '%names = map { $_ => 1 } @F; print unless keys %names == 1' example
name1 name2 name3 name1 name1 name2 name3
name1 name2 name3 name1 name2 name1
name2 name1 name1 name2 name3 name1

或者,更紧凑地,使用匿名哈希

$ perl -ane 'print unless keys %{ {map { $_ => 1 } @F } } == 1' example
name1 name2 name3 name1 name1 name2 name3
name1 name2 name3 name1 name2 name1
name2 name1 name1 name2 name3 name1

相关内容