2013-10-30 51 views
-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链注释所以它在我的文件中出现两次的那些基因中的一个。

+0

顺便说一句,我的问题是为什么我得到216和271.我知道使用awk打印将摆脱其余的领域。谢谢! – user2937872

+0

您正在使用'more'(一个交互式程序),您应该使用'cat',或者甚至更好'cut -f 1 chepner

+0

我的坏习惯。我脑子里的某些东西只允许我使用猫,如果我真的要连接某些东西的话。 – user2937872

回答

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 

现在 - 更新说明,输入和输出你的问题告诉我们您需要什么。

+0

我已经编辑了我的问题,提供了一些更详细的信息,而不会给予太多的帮助。 – user2937872

1

cut使用单个字符(tab默认,但可改变经由-d选项)以单独的字段,而awk使用空白的任何运行(默认,经由-F选项改变)。

awk '$1'打印整个行$1不被视为错误,而不仅仅是第一个字段。这会导致更少的重复行(因为两行可能具有相同的第一个字段,但在后续字段中不同)以及较低的行数。

+0

嗨@chepner。我知道我可以在cut和awk中更改分隔符。事情是,我需要保持整条线路,但我需要仅基于第一个字段筛选重复项。我知道有271个重复项。最终目标是将一个简短的字符串附加到副本中,以便进行另一个不允许重复基因名称的分析。我想我明白你对awk'$ 1'的评价。但那我怎么能保持整条线路,但只过滤第一个字段? – user2937872

+0

'awk'中有一个标准的技巧:'awk'uniq [$ 1] {uniq [$ 1] ++; ...}''只会在'$ 1'之前没有被观察到时处理一行。它所做的第一件事是存储该字段,因此它将忽略具有相同“$ 1”的任何未来行。 – chepner

2

awk '$1'(不要与awk '{print $1}'混淆)将要打印的一切只是是空或者只包含空白,或其中第一场的计算结果为0的数字值cut -f 1不会做此线,并且将包括空白和只有空白的行。

+0

在这种情况下,空白行和空白行不是一个问题。这个25k +行文件中的重复序列来自在正向和反向链上注释过的基因,因此在我的最终文件中出现两次。有些我可以很容易地抓到,其他人一直在逃避我的脚本。 :/ – user2937872

+0

...或$ 1的值为零的行。 –

+1

@EdMorton良好的捕捉...更新。 – twalberg

相关问题