我有一个包含 1000 个文件的文件夹;前面的所有字符都是mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
指个人 ID(例如 NA21117,NA21119,NA21126,..)
NA21117.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21119.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21126.mapped.ILLUMINA.bwa.GIH.low_coverage.20121211.bam_dp
NA21127.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21137.mapped.ILLUMINA.bwa.GIH.low_coverage.20120522.bam_dp
NA21142.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
每个文件只有一行:
cat NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
1 115258827 10
对于这些文件中的每一个,我想将单个 ID 粘贴到文件的内容中并得到如下输出:
1 115258827 10 NA21143
有什么办法吗?
普通的 bash
对于多行文件,仍然可以用普通 bash 完成
笔记:
mapfile
命令将文件读入行数组。${var/pattern/string}
变量值进行搜索和替换。(记录在手册中)%
则该模式锚定在字符串的末尾。在这里,我匹配字符串末尾的空模式。坦率地说,这种方法太聪明了,我会选择更明显的东西。
使用循环:
从 $ARGV 中删除 .* 然后将 \t $ARGV 附加到文件中:
Glenn 的解决方案很可能运行得更快:
虽然如果每个文件只有一行,大部分时间将在驱动器上寻找。
awk
此方法与 GNU (Linux) 和 BSD (Mac) 版本兼容
awk
。id=FILENAME ; sub(/\..*/,"",id)
将每个文件名的第一部分
*.bam_dp
(第一个之前的所有内容.
)存储为id
.print $0 "\t" id
打印每个文件的内容,然后是制表符,然后是记录的
id
.这将打印一个包含行的列表,如您的示例所示:
原始文件不会被修改。
> file.txt
例如,您可以通过添加到命令末尾来保存此输出。