bash - 比较同一文件中的多个列
问题描述
我想比较同一文件中的多个列,以查看我在哪一行有差异,在本例中为前 4 列。该文件如下所示:
Column1 Column2 Column3 Column4 Column5
AA AA AA AA AA
GG GG GG GG GG
CC GC CC CC CC
CC TT CC GC TT
如果我做了这样的事情:
awk -F"\t" '{if ($1==$2) print $1, $2; else print NR}' file.txt
我得到下一个输出:
1
AA AA
GG GG
4
5
但是,我如何用简单的语法同时比较前 4 列?我试过这样的事情:
awk -F"\t" '{if ([$2,$3,$4]==$1) print $1, $2, $3, $4 ; else print NR}' File.txt
但它不工作。
我的预期输出应该是:
1
AA AA AA AA
GG GG GG GG
4
5
我的文件有超过四列,所以我想比较列组,在这种情况下从第 1 列到第 4 列,如果它们具有相同的字符,则只打印这四列,如果它们有差异,则只打印行数。
我怎么能做到这一点?
解决方案
我会使用循环来逐步浏览您的列:
$ awk '{x=0;for(i=1;i<NF;i++){if($i!=$(i+1)){x=1}} print x?NR:$0}' input.txt
或者,为了便于阅读:
{
x=0 # initialize the flag for each line
for (i=1;i<NF;i++) { # step through the fields
if ($i!=$(i+1)) { # test for a match with the next field
x=1 # and set a flag if we see different content.
}
}
print x ? NR : $0 # print NR or the first field depending on flag value
}
这将遍历所有字段(不仅仅是四个),将每个字段的内容与其后字段的内容进行比较。如果在任何时候字段不匹配,则会设置一个标志。
最后一条语句中的三元运算符根据标志选择要显示的输出。
请注意,您的预期输出似乎从行首修剪了空格。如果你真的想要这个,你可以sub(/^[[:space:]]+/,"")
在print
声明之前。
推荐阅读
- javascript - 禁用浏览器刷新图标
- r - 合并具有名称序列的多个 csv 文件
- angular - 子路由在其下方显示父级的 html 组件
- asp.net-mvc - 使用会话在 azure mvc 应用程序中存储数据
- java - 如何对 Map 类型的地图进行排序
> 在 Java 中 - c - Flex 和 Bison,使用符号表的 Windows 错误
- google-apps-script - 如果两个范围之间存在共同值,则显示该值
- c# - 由于事件而改变内部控制
- php - Instagram api - 获取特定用户的所有照片/内容
- c# - 主线程不等待 parallel.foreach 结束