bash – 如何根据第3列中的uique标识符打印第1列的第一行和第2列
发布时间:2020-12-15 21:10:12 所属栏目:安全 来源:网络整理
导读:我有一个制表符分隔文件,如下所示: Het 157709 157731 Cluster.90 2 +Het 157739 157760 Cluster.90 2 +Het 164238 164259 Cluster.97 10 +Het 164380 164401 Cluster.97 10 +Het 164396 164417 Cluster.97 10 +Het 164397 164421 Cluster.97 10 +Het 16439
我有一个制表符分隔文件,如下所示:
Het 157709 157731 Cluster.90 2 + Het 157739 157760 Cluster.90 2 + Het 164238 164259 Cluster.97 10 + Het 164380 164401 Cluster.97 10 + Het 164396 164417 Cluster.97 10 + Het 164397 164421 Cluster.97 10 + Het 164397 164420 Cluster.97 10 + Het 164399 164420 Cluster.97 10 + Het 164536 164561 Cluster.97 10 + Het 164576 164598 Cluster.97 10 + Het 164599 164615 Cluster.97 10 + Het 164635 164656 Cluster.97 10 + Het 198007 198031 Cluster.125 3 + Het 198007 198028 Cluster.125 3 + Het 198011 198035 Cluster.125 3 + 我正在寻找一种生成如下文件的有效方法: Het 157709 157760 Cluster.90 2 + Het 164238 164656 Cluster.97 10 + Het 198007 198035 Cluster.125 3 + 对于第4列中的每个唯一条目,我写了一行,其中包括第1列和第2列的第一行,然后是第3,4,5和6列中的最后一行.到目前为止,我尝试了以下解决方案,但似乎非常低效: for i in `awk '{print $4}' filename | sort | uniq` do fgrep -F $i -w filename | awk 'NR==1 {printf $1"t"$2"t"} END {print $3"t"$4"t"$5"t"$6}' >>filename2 done 问题是,当我有一个巨大的文件(487559行)时,这需要永远.是否有更好的解决方案隐藏在某人的头上? 解决方法
这可以在单个awk中完成,这将比您的脚本更有效:
awk '!($4 in a){a[$4]=$1 FS $2; r[++i]=$4; b[$4]=$3 FS $4 FS $5 FS $6; next;} {b[$4]=$3 FS $4 FS $5 FS $6; next} END{for (k=1; k<=i; k++) print a[r[k]],b[r[k]]}' OFS='t' file Het 157709 157760 Cluster.90 2 + Het 164238 164656 Cluster.97 10 + Het 198007 198035 Cluster.125 3 + 为了使其可读: awk '!($4 in a){ a[$4]=$1 FS $2; r[++i]=$4; b[$4]=$3 FS $4 FS $5 FS $6; next; } { b[$4]=$3 FS $4 FS $5 FS $6; next; } END { for (k=1; k<=i; k++) print a[r[k]],b[r[k]] }' OFS='t' file (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |