系统: Linux。巴什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):
List=${1};
awk -F'\t' -vOFS='\t' '{ $1 = "${1%.bam}" "_string.bam" }1' < ${List} ;其产出是:
${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 --它是另一种语言,这可能是不同的。谢谢!
发布于 2019-01-29 14:04:34
如果我正确理解了您的要求,请您试一试。
val="_string"
awk -v value="$val" '{sub(".bam",value"&")} 1' Input_file简要说明: -v value的意思是在这里将名为val值的shell变量传递给awk变量variable。然后利用awk的sub函数将字符串.bam替换为字符串值和&也表示的.bam值。然后提到1意味着打印编辑/非编辑行。
为什么OP的尝试没有成功:亲爱的,OP。在awk中,我们不能在awk语言中直接传递shell的变量。因此,您要尝试的不是将其作为awk变量,而是将其视为字符串并按原样打印。我在上面的解释中也提到了如何在awk中定义shell变量。
注意:如果您有多个.bam,请在上面的代码中将sub更改为gsub。另外,如果您的Input_file是TAB,那么在上面的代码中使用awk -F'\t'。
发布于 2019-01-29 14:05:36
请注意,您在$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代码基本上将$1的内容与分隔符.分割为Awk上下文中的数组arr。因此,到第一个.为止的字符串部分存储在arr[1]中,随后的拆分字段存储在下一个数组索引中。我们通过将数组条目与文件名部分中的_string连接起来,重新构造您选择的文件名,没有扩展名。
发布于 2019-01-29 16:05:56
sed -i 's/\.bam/_string\.bam/g' myfile.txt这是一条带有sed的单线。只需将.bam替换为_string.bam
https://stackoverflow.com/questions/54422571
复制相似问题