我正在尝试编写一个bash脚本来接受多个样本名称作为参数,以便调用它们对应的文件并对这些文件运行一系列步骤。我知道在单独运行每个步骤时步骤有效,但我正在尝试使事情更加自动化。
我不会粘贴这里的所有步骤,所以它不会太混乱,因为它看起来像是在以下脚本的awk
步骤失败,因为它没有替换右边的正确的东西地方。
我希望$SAMPLE
来自命令行的输入,我希望$1
引用我正在尝试调用的文件中的第一个字段。
#!/bin/bash
for SAMPLE in "$@"
do
echo 'awk -F '\t' '{print $1}' /path/$SAMPLE/path/$SAMPLE_filename.txt > pattern.txt'
awk -F '\t' '{print $1}' /path/$SAMPLE/path/$SAMPLE_filename.txt > pattern.txt
done
当我运行此程序时,程序失败时会出现以下错误:
awk -F '\t' '{print 10-23Aug-PI}' /path/10-23Aug-PI/path/.txt > pattern.txt
awk: fatal: cannot open file `/path/10-23Aug-PI/path/.txt' for reading (No such file or directory)
显然,除非我在运行脚本时输入多个样本名称,否则它将文件名设为$1
,然后不设为$SAMPLE
。
有没有办法重写awk
脚本或使用awk
之外的其他内容,这样我就可以提取文件中的第一个字段,但仍然可以从命令中将参数传递给bash脚本线?
谢谢!
答案 0 :(得分:0)
您的脚本中只有一个问题。变量$SAMPLE_filename
未定义。我假设你的意思是${SAMPLE}_filename
。这就是为什么你得到一个文件.txt
而不是10-23Aug-PI_filename.txt
,
$1
被替换的原因是由单引号引起的。如果您正确计算了echo
行,则会注意到$1
未加引号,因此会被值$1
替换。 awk
将按预期工作。
您的脚本的更正版本可以是:
#!/bin/bash
for SAMPLE in "$@"; do
echo "awk -F '\t' '{print $1}' /path/$SAMPLE/path/${SAMPLE}_filename.txt > pattern.txt"
awk -F '\t' '{print $1}' /path/$SAMPLE/path/${SAMPLE}_filename.txt > pattern.txt
done