-1

所以这个问题困扰着我,我还有一百万个其他项目要做,所以我希望能解决这个问题。到目前为止,我还没有找到答案。看起来很简单。我用了:

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 链上注释的基因之一,因此它在我的文件中出现了两次。

4

3 回答 3

2

我在评论中看到您说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

现在 - 用描述、输入和输出更新您的问题,告诉我们您还需要什么。

于 2013-10-30T16:04:41.170 回答
2

awk '$1'(不要与 混淆awk '{print $1}')将打印除空行或仅包含空格的行之外的所有内容,或者第一个字段评估为数值 0 的行。cut -f 1不会这样做,并且将包括空行和仅空格线。

于 2013-10-30T15:40:11.000 回答
1

cut使用单个字符(tab默认情况下,但可通过-d选项更改)来分隔字段,同时awk使用任何空格(默认情况下,可通过-F选项更改)。

awk '$1'当不被认为是假时打印整行$1,而不仅仅是第一个字段。这将导致更少的重复行(因为两行可能具有相同的第一个字段,但在后续字段中不同),并且行数更少。

于 2013-10-30T15:28:25.520 回答