Bash 在Awk中对一个列条目使用时,参数扩展不起作用
系统:Linux。Bash 4 我有以下文件,将作为变量读入脚本:Bash 在Awk中对一个列条目使用时,参数扩展不起作用,bash,awk,variable-expansion,Bash,Awk,Variable Expansion,系统:Linux。Bash 4 我有以下文件,将作为变量读入脚本: /path/sample_A.bam A 1 /path/sample_B.bam B 1 /path/sample_C1.bam C 1 /path/sample_C2.bam C 2 我想在第一列的文件名末尾附加“_string”,但在扩展名(.bam)之前。这有点棘手,因为在名称的开头包含路径 所需输出: /path/sample_A_string.bam A 1 /path/sample_B_string.bam B
/path/sample_A.bam A 1
/path/sample_B.bam B 1
/path/sample_C1.bam C 1
/path/sample_C2.bam C 2
我想在第一列的文件名末尾附加“_string”,但在扩展名(.bam)之前。这有点棘手,因为在名称的开头包含路径
所需输出:
/path/sample_A_string.bam A 1
/path/sample_B_string.bam B 1
/path/sample_C1_string.bam C 1
/path/sample_C2_string.bam C 2
我的尝试:
我执行了以下脚本(我运行了:bash script.sh):
问题:
我遵循了在这个线程中使用awk进行替换的想法,但是参数${1%.bam}的扩展显然没有被awk识别。有人知道那部分代码的正确语法吗?该部分的意思是“第一列的所有第一个条目,除了.bam的最后一部分”。我使用${1%.bam}是因为它在Bash中工作,但它是另一种语言,可能不同。谢谢大家! 如果我正确理解您的要求,请您尝试以下内容
val="_string"
awk -v value="$val" '{sub(".bam",value"&")} 1' Input_file
简要说明:-v value
表示将名为val
值的外壳变量传递给awk变量变量
。然后使用awk
的sub
函数将字符串.bam
替换为字符串值以及表示的.bam
值。然后提到1
表示打印编辑/非编辑行
OP尝试失败的原因:亲爱的,OP。在awk
中,如果不在awk
语言中提及shell变量,我们无法直接传递它们。因此,您尝试的不是将其作为awk
变量,而是将其作为字符串并按原样打印。我在上面的解释中也提到了如何在awk
中定义shell变量
注意:如果您多次出现
.bam
,请将上述代码中的sub
更改为gsub
。另外,如果您的输入文件是TAB delmited,请在上述代码中使用awk-F'\t'
。如果我正确理解您的要求,请尝试以下内容
val="_string"
awk -v value="$val" '{sub(".bam",value"&")} 1' Input_file
简要说明:-v value
表示将名为val
值的外壳变量传递给awk变量变量
。然后使用awk
的sub
函数将字符串.bam
替换为字符串值以及表示的.bam
值。然后提到1
表示打印编辑/非编辑行
OP尝试失败的原因:亲爱的,OP。在awk
中,如果不在awk
语言中提及shell变量,我们无法直接传递它们。因此,您尝试的不是将其作为awk
变量,而是将其作为字符串并按原样打印。我在上面的解释中也提到了如何在awk
中定义shell变量
注意:如果您多次出现
.bam
,请将上述代码中的sub
更改为gsub
。同样,如果您的输入文件是TAB delmited,则在上述代码中使用awk-F'\t'
。请注意,您在$1
上应用的参数扩展不会在awk
内部作为整个命令应用
awk
命令的主体在“…”
中传递,它不应用任何
shell解析。因此,字符串“${1%.bam}”
将按原样传递给第一列
您可以在Awk
awk -F'\t' 'BEGIN { OFS = FS }{ n=split($1, arr, "."); $1 = arr[1]"_string."arr[2] }1' file
代码基本上在
Awk
的上下文中将带有分隔符
的$1
的内容拆分为数组arr
。因此,字符串到第一个
的部分存储在arr[1]
中,随后的拆分字段存储在下一个数组索引中。我们通过将数组项与文件名部分中的\u字符串
连接起来(不带扩展名),重新构造您选择的文件名 请注意,在$1
上应用的参数扩展不会在awk
内部作为整个命令应用
sed -i 's/\.bam/_string\.bam/g' myfile.txt
awk
命令的主体在“…”
中传递,它不应用任何
shell解析。因此,字符串“${1%.bam}”
将按原样传递给第一列
您可以在Awk
awk -F'\t' 'BEGIN { OFS = FS }{ n=split($1, arr, "."); $1 = arr[1]"_string."arr[2] }1' file
代码基本上在Awk
的上下文中将带有分隔符
的$1
的内容拆分为数组arr
。因此,字符串到第一个
的部分存储在arr[1]
中,随后的拆分字段存储在下一个数组索引中。我们通过将数组项与文件名部分中的\u字符串
连接起来(不带扩展名),重新构造您选择的文件名
sed -i 's/\.bam/_string\.bam/g' myfile.txt
这是一条带有sed的单行线。只需将.bam替换为_string.bam即可
这是一条带有sed的单行线。只需将.bam替换为_string.bam就可以使用awk尝试以下方法:
awk -v a='_string' 'BEGIN{FS=OFS="."}{$1=$1 a}1' infile
您可以使用awk尝试以下方法:
awk -v a='_string' 'BEGIN{FS=OFS="."}{$1=$1 a}1' infile
您需要在
Awk
的上下文中导入$1
。您的尝试不起作用,因为awk
无法将$1
识别为存储内容的占位符。$1并不是要调用名为“$1”的变量,而是应该是文件的第一列(假定文件有行和列)。这里的问题不同,该线程没有解决它。您需要在Awk
的上下文中导入$1
。您的尝试不起作用,因为awk
无法将$1
识别为存储内容的占位符。$1不是用来调用名为“$1”的变量,而是用来调用它