如何将标题添加到以第二列作为目录名称的列 [duplicate]

How to add headers to columns with second column as directory name [duplicate]

提问人:Shafaque Zahra 提问时间:10/18/2023 最后编辑:BarmarShafaque Zahra 更新时间:10/18/2023 访问量:52

问:

我在多个目录中都有包含 ID 和计数的计数文件(对于每个登录 SRRXXXXX)。我想使用 bash 循环在每个文件中添加标头“gene_id”和 SRRabcdXXX。

目录结构如下:

SRRabcd
  count.txt
SRRefgh
  count.txt

我的文件

gene1 194
gene2 40     

我在做什么

#!/bin/bash
for dir in /home/path/to/dir/SRR*/
do
sed -i '1s/^/gene_id\t"${dir}"\n/' "$dir"/count.txt
done

我的输出

gene_id "${dir}"
gene1 194
gene2 40

我想要的输出(对于单个文件)

gene_id SRRabcdef
gene1 194
gene2 40
Linux Bash 循环 SED 生物信息学

评论

0赞 David Grayson 10/18/2023
您在字符串(sed 的第二个参数)周围键入了单引号而不是双引号,因此 Bash 不会在字符串中执行变量替换,并且 Bash 只会传递给 sed 而不是实际的目录名称。${dir}
0赞 Shafaque Zahra 10/18/2023
通过传递 ${dir},其返回: gene_id ${dir} gene1 194 gene2 40
0赞 Shafaque Zahra 10/18/2023
sed -i '1s/^/gene_id\t“${dir}”\n/' “$dir”/count.txt;sed -i '1s/^/gene_id\t'${dir}'\n/' “$dir”/count.txt;sed -i '1s/^/gene_id\t${dir}\n/' “$dir”/count.txt 给出相同的结果。

答:

1赞 markp-fuso 10/18/2023 #1

要替换为其实际值,您需要确保用双引号括起来;虽然您的脚本中确实有,但它嵌入在一对单引号中,这有效地否定了内部双引号,最终结果是您在输出中结束了文字字符串。${dir}${dir}"${dir}"sed"${dir}"

一种简单的方法是将 3 个字符串附加在一起以形成您的脚本,例如:sed

# '1s/^/gene_id\t' + "${dir}" + '\n/' 

sed '1s/^/gene_id\t'"${dir}"'\n/' 

但更简单(也是推荐的)方法是确保整个脚本用双引号括起来,例如:sed

sed "1s/^/gene_id\t${dir}\n/" "$dir"/count.txt
    ^                       ^

示例数据:

$ head SRR*/count.txt
==> SRRabcd/count.txt <==
gene1 194
gene2 40

==> SRRefgh/count.txt <==
gene1 395
gene2 17

修改后的脚本:

for dir in SRR*
do 
    echo "########## $dir"
    sed "1s/^/gene_id\t${dir}\n/" "$dir"/count.txt
done

这将产生:

########## SRRabcd
gene_id SRRabcd
gene1 194
gene2 40
########## SRRefgh
gene_id SRRefgh
gene1 395
gene2 17

确认结果正确后,您可以添加标志。-i

评论

0赞 Shafaque Zahra 10/18/2023
多谢。成功了。以下是脚本
0赞 Shafaque Zahra 10/18/2023
for dir in */ do echo “${dir%*/}” (# 去掉尾随的 “/”) sed -i “1s/^/gene_id\t${dir%*/}\n/” “$dir”/count.txt done