首页 > 解决方案 > 将文件名添加到计数数据

问题描述

假设我有类似于以下的文件。

文件 1

1,144931087,144931087,T,C  
16,89017167,89017167,C,G  
17,7330235,7330235,G,T  
17,10222478,10222478,C,T  

文件 2

1,144931087,144931087,T,C
16,89017167,89017167,C,G
17,10222478,10222478,C,T

文件 3

17,10222478,10222478,C,T  

我想知道每个文件中有多少次重复值,所以理想情况下,输出应该是这样的:

输出

2 1,144931087,144931087,T,C  
2 16,89017167,89017167,C,G  
3 17,10222478,10222478,C,T  
1 17,7330235,7330235,G,T 

我使用以下命令来计算重复值。

sort Test1.csv Test2.csv Test3.csv | uniq --count

现在我想为计数的输出添加文件名。我想要的输出应该是这样的:

Test1 Test2 2 1,144931087,144931087,T,C  
Test1 Test2 2 16,89017167,89017167,C,G  
Test1 Test2 Test 3 3 17,10222478,10222478,C,T  
Test1 1 17,7330235,7330235,G,T  

谁能帮助我获得所需的输出,或者任何人都可以建议我更好的方法来获得所需的输出?

标签: unixawkcomparecomparisonstring-comparison

解决方案


使用 awk。对不起我聪明的文件命名方案:

$ awk '{
    a[$0]++                   # count hits
    b[$0]=b[$0] FILENAME " "  # store filenames
}
END {
    for(i in a)               
        print b[i] a[i],i     # output them
}' foo bar baz
foo bar 2 1,144931087,144931087,T,C
foo bar 2 16,89017167,89017167,C,G
foo bar baz 3 17,10222478,10222478,C,T
foo 1 17,7330235,7330235,G,T

根据评论更新:

$ awk 'BEGIN {
    FS=OFS=","
} 
{
    a[$1 OFS $2 OFS $3 OFS $4]++ 
    b[$1 OFS $2 OFS $3 OFS $4]=b[$1 OFS $2 OFS $3 OFS $4] FILENAME "|"
    c[$1 OFS $2 OFS $3 OFS $4]=$0                      # keep the last record with 
}                                                      # specific key combination 
END { 
    for(i in a) 
        print b[i] "," a[i],c[i]  
}' foo  bar baz
foo|bar|,2,16,89017167,89017167,C
foo|,1,17,7330235,7330235,G
foo|bar|,2,1,144931087,144931087,T
foo|bar|baz|,3,17,10222478,10222478,C

推荐阅读