现在需要从文件“*.wgs_metrics.txt”中提取含有字符"GENOME_TERRITORY"的行及其下一行的内容,并输出至csv表格中

使用grep -A 1 ./*.wgs_metrics.txt命令可以快速提取并重定向输出至csv表格中,但其结果并不会分列,这是因为原数据是tab分割符,而csv文件是逗号分隔符

这时需要使用sed 's/[/]/,/g'命令将所有tab分隔符替换为逗号分割符,但是此时会有一个问题,grep命令输出的文件路径与数据间会存在冒号和连字符,如下

./get_fq_num_gradient/sample1_10k/group1/sample1.wgs_metrics.txt:GENOME_TERRITORY,MEAN_COVERAGE,...
./get_fq_num_gradient/sample1_10k/group1/sample1.wgs_metrics.txt-4746218,0.434682,...
--
./get_fq_num_gradient/sample2_10k/group2/sample2.wgs_metrics.txt:GENOME_TERRITORY,MEAN_COVERAGE,...
...

而我们希望的是第一列为数据路径,后面的列为数据

此时我们需要使用多个sed命进行处理,如下

grep "GENOME_TERRITORY" -A 1 ./get_fq_num_gradient/*_10k/*/*.wgs_metrics.txt | sed -e '/^--$/d' -e 's/[/]/,/g' -e 's/\.txt[:-]/,/' -e 's/\t/,/g' > ./data_result.csv

详解
用grep -A 1 从文件“*.wgs_metrics.txt”中提取含有字符"GENOME_TERRITORY"的行及其下一行的内容,通过sed删除--空行,之后将/替换为逗号分割‘,’对路径进行拆分,将.txt及其后的冒号和连字符替换为逗号分割‘,’,并将所有的tab分割符\t替换为逗号分割符
-e表示 "expression"(表达式),用于指定一条 sed 处理命令。当需要执行多个处理步骤时,用 -e 分隔不同的命令
g 是 s/源/目标/g 替换命令中的标记,代表 "global"(全局)。默认情况下,sed 的替换命令 s/源/目标/ 只替换每行中第一个匹配到的内容,加上 g 后会替换一行中所有匹配到的内容
$表示从行尾向前匹配,^ 匹配行的开头位置,合起来 ^--$ 就表示「整行内容正好是 --」,用于精准匹配这种分隔行并删除(配合 d 命令),需要注意^在集合[]内部时则表示取反,即不匹配集合内的任一个字符
[] 定义一个字符集合,匹配其中任意一个字符
\转义符

 

posted on 2025-09-04 11:36  caicai2019  阅读(9)  评论(0)    收藏  举报