gpt4 book ai didi

linux - 基于两列(双向)删除重复行,只保留一列

转载 作者:行者123 更新时间:2023-12-01 10:17:51 27 4
gpt4 key购买 nike

我想从制表符分隔的文件中删除重复的行,如下所示:

 arahy.Tifrunner.gnm1.ann1.A4HWYP   arahy.Tifrunner.gnm1.ann1.BWH72M
arahy.Tifrunner.gnm1.ann1.A4HWYP arahy.Tifrunner.gnm1.ann1.PK5V4W
arahy.Tifrunner.gnm1.ann1.BWH72M arahy.Tifrunner.gnm1.ann1.A4HWYP
arahy.Tifrunner.gnm1.ann1.D7QF3J arahy.Tifrunner.gnm1.ann1.A6ZB5M
arahy.Tifrunner.gnm1.ann1.A6ZB5M arahy.Tifrunner.gnm1.ann1.D7QF3J

根据第 1 列和第 2 列获取具有单向行的输出文件,如下所示:

 arahy.Tifrunner.gnm1.ann1.A4HWYP   arahy.Tifrunner.gnm1.ann1.BWH72M
arahy.Tifrunner.gnm1.ann1.A4HWYP arahy.Tifrunner.gnm1.ann1.PK5V4W
arahy.Tifrunner.gnm1.ann1.D7QF3J arahy.Tifrunner.gnm1.ann1.A6ZB5M

我正在尝试代码

awk -F'\t' '!x[$2];{x[$1]++}' input.txt > out.txt

但是它没有提供所需的输出,而是简单地删除了原始文件的最后一行。有什么方法可以使用 awk 和/或排序来做到这一点吗?

最佳答案

$ awk 'BEGIN{FS=OFS="\t"}
!(($1 FS $2 in x) || ($2 FS $1 in x));
{x[$1 FS $2]}' ip.txt
arahy.Tifrunner.gnm1.ann1.A4HWYP arahy.Tifrunner.gnm1.ann1.BWH72M
arahy.Tifrunner.gnm1.ann1.A4HWYP arahy.Tifrunner.gnm1.ann1.PK5V4W
arahy.Tifrunner.gnm1.ann1.D7QF3J arahy.Tifrunner.gnm1.ann1.A6ZB5M
  • BEGIN{FS=OFS="\t"} 将输入和输出字段分隔符设置为制表符
  • {x[$1 FS $2]} 使用制表符分隔的第一个和第二个字段作为键
  • $1 FS $2 in x$2 FS $1 in x 检查第一个和第二个字段是否以任何顺序作为键存在

您还可以将其简化为:

awk 'BEGIN{FS=OFS="\t"} !(($0 in x) || ($2 FS $1 in x)); {x[$0]}'

或者(刚刚意识到不需要 OFS)

awk -F'\t' '!(($0 in x) || ($2 FS $1 in x)); {x[$0]}'

关于linux - 基于两列(双向)删除重复行,只保留一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59262732/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com