将基本名称添加到输出文件

将基本名称添加到输出文件

我有一个处理输入文件并生成输出文件的脚本。我希望每个文件的基名成为输出文件的一部分,但它不起作用:

while IFS= read -r line
do
tmp_header="tmp_header"
echo "Processing $line"
Sample_name=`basename -s .fastq.gz $line`
gsutil cat $line | zcat | awk 'BEGIN {FS = ":"} {lane=$4 ; print > "${Sample_name}.lane."lane".fastq.gz" ; for (i = 1; i <= 3; i++) {getline ; print > "${Sample_name}.lane."lane".fastq.gz"}}'
done < "test.list.paths.Bcancer2.txt"


$ cat test.list.paths.Bcancer2.txt
gs://fc-0e96c1b9-ba10-44f3-8b07-91a4c1a5cf14/10002/10002_R1.fastq.gz

输出文件

-rw-r--r-- 1 xkwaku001 2.2G Jul  8 05:54 '${Sample_name}.lane.2.fastq.gz'

但我希望我的结果是这样的:

$ 10002_R1.lane.2.fastq.gz

感谢您的帮助。

答案1

切入看似重要的部分,你有:

Sample_name=something
awk '{lane=$4 ; print > "${Sample_name}.lane."lane".fastq.gz"; ...}'
#   ^                   *                    *                     ^

Sample_name并且您可能希望 awk在文件名中使用 shell 变量的值。 shell 不会扩展该变量,因为它位于单引号字符串内。 (如果它是双引号的,则需要转义脚本中的双引号和美元符号。)awk 也不会扩展它,因为它位于 awk 脚本中的双引号字符串中(并且它是 shell语法,而不是 awk 语法)。

因此,完成此操作的最简单方法是将 shell 变量传递给 awk,使用awk -v,并在 awk 脚本中使用它,就像您现在使用的一样line。一个简化的例子:

Sample_name=foobar
awk -v SN="$Sample_name" 'BEGIN {lane=123; print SN ".lane." lane ".fastq.gz" }'

运行会打印foobar.lane.123.fastq.gz.

答案2

您正在使用awk 脚本内的变量$sample_name,但 awk 无权访问该变量。更重要的是,由于它被引用,awk 会将其视为您所看到的字符串。这是脚本的工作版本:

while IFS= read -r line
do
    tmp_header="tmp_header"
    echo "Processing $line"
    Sample_name=$(basename -s .fastq.gz "$line")
    gsutil cat "$line" | zcat | 
        awk -v sname="$Sample_name" '
            BEGIN {FS = ":"} 
            {
                lane=$4;
                fileName = sname".lane."lane".fastq.gz" 
                print > fileName
                for (i = 1; i <= 3; i++) {
                    getline
                    print > fileName
                }
            }'
done < test.list.paths.Bcancer2.txt

答案3

我确信,如果您用双引号替换单引号并转义 awk 程序中的引号,您会更高兴。此外,您可以使用 -F 为 awk 的运行指定字段分隔符,并避免必须在 BEGIN 块中设置它,并且cat $line | zcat ...您可以键入zcat $line ...以避免对猫的无用利用

我希望这有帮助!

相关内容