Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用$向Bash和awk传递参数时引用了错误的内容_Linux_Bash_Shell_Awk - Fatal编程技术网

Linux 使用$向Bash和awk传递参数时引用了错误的内容

Linux 使用$向Bash和awk传递参数时引用了错误的内容,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我试图编写一个bash脚本,接受多个示例名称作为参数,以便调用它们对应的文件,并对这些文件运行一系列步骤。我知道在单独运行每个步骤时,这些步骤都会起作用,但我正在努力使事情更加自动化 我不会在这里粘贴所有步骤,这样它就不会变得太混乱,因为它看起来在下面脚本中的awk步骤失败,因为它没有在正确的位置替换正确的内容 我希望$SAMPLE来自命令行的输入,我希望$1引用我试图调用的文件中的第一个字段 #!/bin/bash for SAMPLE in "$@" do echo 'awk -

我试图编写一个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脚本传递参数


谢谢

脚本中只有一个问题。变量
$SAMPLE\u filename
未定义。我想你的意思是
${SAMPLE}\u文件名
。这就是为什么您会得到一个文件
.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

看起来很有效-非常感谢!没关系-我说得太快了-我仍然看到以下内容:awk-F t{print 10-23Aug-PI}/ufrc/cschnitzler/kelsey.yetsko/trimmed_reads/$SAMPLE/alignments\u virtual/${SAMPLE}_CP_all_viral_old.txt>pattern.txt grep-f/ufrc/cschnitzler/kelsey.yetsko/trimmed_reads/pattern.txt/ufrc/cschnitzler/kelsey.yetsko/trimmed_reads/$SAMPLE/alignments_viral/hisat2${SAMPLE}viral_old.fasta>tmp.txt您的报价肯定有误。由于您使用单引号,并且从您写下的信息中,我只能得出结论,除了打印$1部分之外,大多数都在单引号之间。我之所以这样说,是因为单引号之间的字符串没有任何形式的变量替换。它们是文本字符串。这与双引号有很大的区别。@K.Yetsko你能把产生上述结果的行写出来吗?@K.Yetsko你写的也是你的
echo
行。
pattern.txt
的内容是什么使用
set-x
,而不是
echo
,来记录命令的执行方式
echo
的结果完全不正确;它们显示实际没有发生的替换,因为echo的引用与实际命令的引用不同。或者:
printf“%q”awk-F'\t'{print$1}'/path/$SAMPLE/path/$SAMPLE\u filename.txt;echo
可以。感谢您的建议-此命令确实生成了正确的命令日志,而不是echo