所以这个问题困扰着我,我还有一百万个其他项目要做,所以我希望能解决这个问题。到目前为止,我还没有找到答案。这似乎很简单。我使用过:
awk '$1' merged_counts.txt |sort|uniq -d|wc
并获得了216行。但是,该数字不正确。如果我使用
more merged_counts.txt|cut -f 1|sort|uniq -d|wc
我得到 271 行,这是正确的。如果我使用
awk '{print $1}' merged_counts.txt |sort|uniq -d|wc
我也得到了 271 行,但是,我也失去了其余的字段。我无法弄清楚为什么它的行为方式似乎是基本的东西。感谢您的任何帮助/建议。当然,我一定忽略了什么。
文件示例:
B3GALT1 72 128 65 124 87 118 102 117 38 106 87 115 27 20 89 30
AMY1A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
PSENEN 654 459 648 462 508 399 537 532 696 460 625 473 621 322 633 434
基因"AMY1A"是注释在两条DNA链上的基因之一,因此它在我的文件中出现了两次。
我在评论中看到你说I need to keep the entire line, but I need to filter for duplicates based only on the first field
所以让我们从这个开始,让我们进一步假设你的字段被任何空格分隔,并且你总是想在发生重复时打印第一行。
然后您使用的awk命令将是:
awk '!seen[$1]++' file
现在 - 用描述、输入和输出更新您的问题,告诉我们您还需要什么。
awk '$1'
(不要与awk '{print $1}'
混淆)将打印除空行或仅包含空格的行或第一个字段的计算结果为 0 的行之外的所有内容。 cut -f 1
不会这样做,并且将包括空行和仅空格行。
cut
使用单个字符(默认tab
,但可以通过-d
选项进行更改)来分隔字段,而awk
使用任何空格(默认情况下,可通过-F
选项进行更改)。
当$1
不被视为 false 时,awk '$1'
打印整行,而不仅仅是第一个字段。这将导致重复行更少(因为两行可能具有相同的第一个字段,但在后续字段中有所不同)和更少的行数。