AWK选择所有列均相等的行

时间:2019-09-18 01:28:03

标签: awk

我有一个带有制表符分隔值的文件,其中列数不是先验的。换句话说,文件中的列数是一致的,但是不同的文件具有不同的列数。第一列是键,其他列是一些任意值。

我需要过滤出值不相同的行。例如,假设列数为4,我需要保留前2行并过滤掉第3行:

1   A   A   A
2   B   B   B
3   C   D   C

我打算为此目的使用AWK,但我不知道如何处理列数未知的事实。已知列数的情况很简单,这是4列的解决方案:

$2 == $3 && $3 == $4 {print}

如何概括任意数量列的解决方案?

5 个答案:

答案 0 :(得分:4)

如果您保证没有字段包含正则表达式有效的字符,并且第一个字段永远不会与第二个字段匹配,并且输入中没有空行:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<span id="1" class="tool-tip" data-toggle="tooltip" data-placement="top" title="">
<input id="submit1" class=" btn btn-primary " type="submit" disabled="disabled" data-toggle="modal" data-target="#success-modal"  title="" value="1">
</span>
<span id="2" class="tool-tip" data-toggle="tooltip" data-placement="top" title="">
<input id="submit2" class=" btn btn-primary " type="submit" disabled="disabled" data-toggle="modal" data-target="#success-modal"  title="" value="2">
</span>

请注意,此解决方案是为此特定情况设计的,并且扩展性较其他解决方案小。

答案 1 :(得分:3)

另一种轻微的扭曲。在您的情况下,您知道要比较字段2-4,因此可以简单地从i=3;i<=NF循环检查$i!=$(i-1)是否相等,如果失败,则不打印,获取下一条记录,例如

awk '{for(i=3;i<=NF;i++)if($i!=$(i-1))next}1'

使用/输出示例

将数据保存在file.txt中:

$ awk '{for(i=3;i<=NF;i++)if($i!=$(i-1))next}1' file.txt
1   A   A   A
2   B   B   B

答案 2 :(得分:0)

能否请您尝试以下。这将比较从第二列到最后一列的所有列,并检查每个元素是否相等。如果它们都相同,将打印行。

awk '{for(i=3;i<=NF;i++){if($(i-1)==$i){count++}};if((NF-2)==count){print};count=""}' Input_file

OR(通过对代码中的$2进行硬编码,因为如果$2=$3$3=$4的意思是$2=$3=$4,那么有意将$2用作比较而不是{ {1}}获取其先前的值。)

i-1

答案 3 :(得分:0)

我将使用初始值为t的计数器2加上<{> 1 从 2 < / em>转换为 NF-1 。仅在$i == $(i+1)为true时打印行:

t==NF

答案 4 :(得分:0)

这是问题的概括:

  

选择一组列具有相同值的所有行:c1 c2 c3 c4 ...,其中ci可以是任何数字:

假设我们要选择以下列:2 3 4 11 15

awk 'BEGIN{n=split("2 3 4 11 15",a)}
     {for(i=2;i<=n;++i) if ($(a[i])!=$(a[1])) next}1' file

如果某行可能不包含所有字段,则更加健壮

awk 'BEGIN{n=split("2 3 4 11 15",a)}
     {for(i=2;i<=n;++i) if (a[i] <= NF) if ($(a[i])!=$(a[1])) next}1' file