Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Bash 在Awk中对一个列条目使用时,参数扩展不起作用_Bash_Awk_Variable Expansion - Fatal编程技术网

Bash 在Awk中对一个列条目使用时,参数扩展不起作用

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

系统: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 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”的变量,而是用来调用它