unix - 将文件名添加到计数数据
问题描述
假设我有类似于以下的文件。
文件 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
谁能帮助我获得所需的输出,或者任何人都可以建议我更好的方法来获得所需的输出?
解决方案
使用 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
推荐阅读
- android - 反应原生图像调整大小裁剪图像
- python - 列表元素在 0 元素之后等于 0
- python - Python - 从 SQLite 游标实例化对象
- node.js - 通过 nodemailer 使用 webmail 发送电子邮件
- python - Python中的颜色
- reactjs - 无法将 npm 终端设置为 VS 代码/窗口
- javascript - 从 React js 发送一个 blob 视频文件到烧瓶服务器
- laravel - 为什么路线在 laravel-livewire 中不起作用?
- vba - Visio中的形状动画通过VBA
- java - Java CXF / JAX-WS 可以验证入站 XML 字符编码吗?