提问人:Shafaque Zahra 提问时间:10/18/2023 最后编辑:BarmarShafaque Zahra 更新时间:10/18/2023 访问量:52
如何将标题添加到以第二列作为目录名称的列 [duplicate]
How to add headers to columns with second column as directory name [duplicate]
问:
我在多个目录中都有包含 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
答:
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
评论
${dir}