我想检查文件中的特定模式/字符串,如果它存在于所有列中,我想删除相应的行。
例子:
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