首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当在Awk中使用时,参数展开在其中一个列项上无效

当在Awk中使用时,参数展开在其中一个列项上无效
EN

Stack Overflow用户
提问于 2019-01-29 13:49:41
回答 4查看 925关注 0票数 1

系统: Linux。巴什4号。

我有以下文件,它将作为变量读入脚本中:

代码语言:javascript
复制
/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)之前。因为在名称的开头包含路径,所以比较棘手。

期望输出:

代码语言:javascript
复制
/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):

代码语言:javascript
复制
List=${1};
awk -F'\t' -vOFS='\t' '{ $1 = "${1%.bam}" "_string.bam" }1' < ${List} ;

其产出是:

代码语言:javascript
复制
${1%.bam}_string.bam
${1%.bam}_string.bam
${1%.bam}_string.bam
${1%.bam}_string.bam

问题:--我遵循了使用awk作为这个线程https://unix.stackexchange.com/questions/148114/how-to-add-words-to-an-existing-column中的替换的想法,但是参数${1%.bam}的扩展显然没有像我想的那样被AWK所识别。有人知道这部分代码的正确语法吗?该部分的意思是“除.bam的最后一部分外,第一列的所有第一项”。我使用${1%.bam}是因为它在Bash中工作,但是AWK --它是另一种语言,这可能是不同的。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-01-29 14:04:34

如果我正确理解了您的要求,请您试一试。

代码语言:javascript
复制
val="_string"
awk -v value="$val" '{sub(".bam",value"&")} 1'  Input_file

简要说明: -v value的意思是在这里将名为val值的shell变量传递给awk变量variable。然后利用awksub函数将字符串.bam替换为字符串值和&也表示的.bam值。然后提到1意味着打印编辑/非编辑行。

为什么OP的尝试没有成功:亲爱的,OP。在awk中,我们不能在awk语言中直接传递shell的变量。因此,您要尝试的不是将其作为awk变量,而是将其视为字符串并按原样打印。我在上面的解释中也提到了如何在awk中定义shell变量。

注意:如果您有多个.bam,请在上面的代码中将sub更改为gsub。另外,如果您的Input_file是TAB,那么在上面的代码中使用awk -F'\t'

票数 2
EN

Stack Overflow用户

发布于 2019-01-29 14:05:36

请注意,您在$1上应用的参数扩展不会在awk中应用,因为awk命令的整个命令体是在'..'中传递的,该命令实际上发送内容而不应用任何shell解析。因此,字符串"${1%.bam}"以-原样传递给第一列。

您可以在Awk中完全做到这一点。

代码语言:javascript
复制
awk -F'\t' 'BEGIN { OFS = FS }{ n=split($1, arr, "."); $1 = arr[1]"_string."arr[2] }1'  file

代码基本上将$1的内容与分隔符.分割为Awk上下文中的数组arr。因此,到第一个.为止的字符串部分存储在arr[1]中,随后的拆分字段存储在下一个数组索引中。我们通过将数组条目与文件名部分中的_string连接起来,重新构造您选择的文件名,没有扩展名。

票数 3
EN

Stack Overflow用户

发布于 2019-01-29 16:05:56

代码语言:javascript
复制
sed -i 's/\.bam/_string\.bam/g' myfile.txt

这是一条带有sed的单线。只需将.bam替换为_string.bam

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54422571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档