Bash 代码未正确计算相同行

问题描述 投票:0回答:1

我需要计算我的 OTU/ASV 列表中获得了多少次独特的爆炸命中,但由于某种原因,在看似随机的情况下,相同的行没有正确相加。然而,其他时候,代码工作正常并且总结相同的行没有问题。我已经确保在我的文件上运行 dos2unix,我正在 Linux 上运行我的命令,但我不知道还要检查什么。

这是一个可重现的示例:

名为 check_text.csv 的输入文件,其中包含以下行:

ASV Genus_Species   Taxid
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
46c5e68b0c1230a4305382e0ddf34c5d    Marticorenia foliosa    1910960
46c5e68b0c1230a4305382e0ddf34c5d    Leucheria candidissima  1911693
46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
46c5e68b0c1230a4305382e0ddf34c5d    Oxyphyllum ulicinum 540062

我运行的代码:

dos2unix check_text.csv
dos2unix: converting file check_text.csv to Unix format...

cat check_text.csv | uniq -c > hitcounts.csv

但这是我在 hitcounts.csv 文件中不断得到的输出:

  1 ASV Genus_Species   Taxid
  5 cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
  1 46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
  1 46c5e68b0c1230a4305382e0ddf34c5d    Marticorenia foliosa    1910960
  1 46c5e68b0c1230a4305382e0ddf34c5d    Leucheria candidissima  1911693
  1 46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
  1 46c5e68b0c1230a4305382e0ddf34c5d    Oxyphyllum ulicinum 540062

第一行很好,这些只是标题,不是问题。但我应该看到以下内容:

  1 ASV Genus_Species   Taxid
  5 cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
  2 46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
  1 46c5e68b0c1230a4305382e0ddf34c5d    Marticorenia foliosa    1910960
  1 46c5e68b0c1230a4305382e0ddf34c5d    Leucheria candidissima  1911693
  1 46c5e68b0c1230a4305382e0ddf34c5d    Oxyphyllum ulicinum 540062

Moscharia solbrigii 的品系出现了两次,好像这些品系不相同,但它们确实相同。可能是什么问题?我手动检查其中一些是否有多余的空格,但没有。

bash
1个回答
0
投票

您可以将 Ruby 与 CSV 解析器和生成器一起使用:

ruby -r csv -e '
opts={:headers=>true, :col_sep=>"\t"}
puts CSV.generate(**opts){ |csv|  
        tbl=CSV.parse($<.read, **opts)
        tally=tbl.map{|row| row.to_a.map(&:last)}.tally
        csv<<["1"]+tbl.to_a[0]
        tally.each{|x,cnt| csv<<[cnt]+x }
        } 
' file.tsv
© www.soinside.com 2019 - 2024. All rights reserved.