我有一个带有制表符分隔值的文件,其中列数不是先验的。换句话说,文件中的列数是一致的,但是不同的文件具有不同的列数。第一列是键,其他列是一些任意值。
我需要过滤出值不相同的行。例如,假设列数为4,我需要保留前2行并过滤掉第3行:
1 A A A
2 B B B
3 C D C
我打算为此目的使用AWK,但我不知道如何处理列数未知的事实。已知列数的情况很简单,这是4列的解决方案:
$2 == $3 && $3 == $4 {print}
如何概括任意数量列的解决方案?
答案 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