解决while read line与awk变量传递问题,生成BED文件存储路径
解决BED文件路径转换中的Shell变量传递问题
问题场景
当前目录下存在以下文件:
$ ls listofdirectories CTCF_BEDfiles EZH2_BEDfiles H2AFZ_BEDfiles ... +30 or so more *BEDfiles
其中listofdirectories内容为:
$ cat listofdirectories CTCF_assay EZH2_assay H2AFZ_assay ... etc.
每个*BEDfiles是压缩文件,例如CTCF_BEDfiles的内容:
$ zcat CTCF_BEDfiles ENCFF509KKI.bed.gz ENCFF509KKI.bed.gz ENCFF490CTJ.bed.gz ... etc.
已为listofdirectories中的每行创建对应目录(如~/folder/CTCF_assay),需要将每个*BEDfiles中的文件名转换为完整路径,合并到pathsforBEDfiles文件,期望输出:
$ cat pathsforBEDfiles ~/folder/CTCF_assay/ENCFF509KKI.bed.gz ~/folder/CTCF_assay/ENCFF509KKI.bed.gz ~/folder/CTCF_assay/ENCFF490CTJ.bed.gz ... etc.
尝试了以下命令,但结果不符合预期:
$ cat listofdirectories | while read line ; do zcat "${line%assay}BEDfiles" | awk '{print "~/folder/"$line"/"$0"/"}'; done > pathsforBEDfiles
实际返回结果中,$line被替换为*BEDfiles中的行内容,而非listofdirectories中的目录名:
~/folder/ENCFF509KKI.bed.gz/ENCFF509KKI.bed.gz/ ~/folder/ENCFF509KKI.bed.gz/ENCFF509KKI.bed.gz/ ~/folder/ENCFF490CTJ.bed.gz/ENCFF490CTJ.bed.gz/ ... etc.
解决方案
问题根源是awk无法直接访问Shell的line变量,需要用awk的-v选项将Shell变量传递到awk环境中,同时修正路径末尾的多余斜杠。修改后的命令如下:
cat listofdirectories | while read line ; do zcat "${line%assay}BEDfiles" | awk -v dir="$line" '{print "~/folder/" dir "/" $0}'; done > pathsforBEDfiles
关键说明
-v dir="$line":将Shell变量line的值传递给awk内部的变量dir,确保awk能正确引用listofdirectories中的目录名。- 移除了原命令中
$0后的多余斜杠,避免生成格式错误的路径。
内容的提问来源于stack exchange,提问作者Steven James
相关产品推荐
相关产品推荐

