awk $ 1 vs cut -f 1 - 为什么我会得到不同的答案?

时间:2013-10-30 15:24:55

标签: bash awk cut

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

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

3 个答案:

答案 0 :(得分:2)

awk '$1'(不要与awk '{print $1}'混淆)将打印除空行或仅包含空格的行之外的所有内容,或者第一个字段计算为数值0的行。{ {1}}不会执行此操作,并且将包含空行和仅空白行。

答案 1 :(得分: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

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

答案 2 :(得分:1)

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

awk '$1'不被视为false时,

$1会打印整行,而不仅仅是第一个字段。这将导致更少的重复行(因为两行可能具有相同的第一个字段,但后续字段不同),并且行数较少。