我有一个文件名列表-由
模拟f="HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam HDAC3_CTRL_Diff-D0_B.dedup.sorted.bam"
我希望我的操作选择文本"HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam"
并将其处理为"HDAC3_CTRL_Diff-D0_A"
我正在尝试
echo $f | awk '/_A/ { echo }' | sed 's/.dedup.sorted.bam//g'
但是一开始就陷入困境
awk '/_A/ { echo }' $f
给我错误
awk: fatal: cannot open file `HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam' for reading (No such file or directory)
我不希望它打开任何文件。我只想解析列表以生成一个截断的字符串。
答案 0 :(得分:0)
第一个解决方案: :在awk
中,它不能像BASH一样工作,我们为它print
提供了单独的echo
功能不会在其中工作。您可以尝试执行以下操作(这会将.
中的所有内容删除,直到所传递变量的所有部分都排到最后一行。
echo "$f" | awk '{for(i=1;i<=NF;i++){sub(/\..*/,"",$i);print $i}}'
HDAC3_CTRL_Diff-D0_A
HDAC3_CTRL_Diff-D0_B
第二种解决方案如果您要查找特定的字符串并删除其中的某些部分,请尝试执行以下操作:
echo "$f" | awk 'match($0,/HDAC3[^ ]*/){val=substr($0,RSTART,RLENGTH);sub(/\..*/,"",val);print val}'
HDAC3_CTRL_Diff-D0_A
OR(溶液的一种非衬里形式):
f="HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam HDAC3_CTRL_Diff-D0_B.dedup.sorted.bam"
echo "$f" |
awk '
match($0,/HDAC3[^ ]*/){
val=substr($0,RSTART,RLENGTH)
sub(/\..*/,"",val)
print val
}
'
第三个解决方案: :如果有人想查找确切的字符串,请尝试遵循。
echo "$f" | awk 'match($0,/HDAC3_CTRL_Diff-D[0-9]+_A/){print substr($0,RSTART,RLENGTH)}'
第四个解决方案: :如果在不同字段的行中可能多次出现_A
,请尝试遵循。
假设您的变量f
具有以下值。
echo "$f"
HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam HDAC3_CTRL_Diff-D0_B.dedup.sorted.bam HDAC3_CTRL_Diff-D01_A.dedup.sorted.bam
现在,当我们运行新代码时:
echo "$f" | awk '{for(i=1;i<=NF;i++){if($i ~ /HDAC3_CTRL_Diff-D[0-9]+_A/){print $i}}}'
HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam
HDAC3_CTRL_Diff-D01_A.dedup.sorted.bam
OP尝试中发现的问题:
awk
中没有echo
函数,而是具有“打印”功能。awk
当您尝试像awk......$f
一样传递时,表示您正在向其传递Input_file,在这里不是这种情况,因此您不应该这样做。awk
并进行处理的文本,请尝试使用echo "text here...." | awk code here.
或awk ..... <<<"$var"
作为示例。答案 1 :(得分:0)
我不确定awk中是否存在echo
,而是要使用print
,并仅打印第一个字段$1
:
$ f="HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam HDAC3_CTRL_Diff-D0_B.dedup.sorted.bam"
$ echo $f | awk '/_A/ { print $1 }' | sed 's/.dedup.sorted.bam//g'
HDAC3_CTRL_Diff-D0_A
打开文件的错误是因为您在命令行上将$f
传递给了awk
,而不是将变量的内容通过管道传递到awk
中。 awk
的命令行参数被视为文件名。您可以在其中放置实际的文件名,但不能放置此$f
变量(我认为该变量包含输入文件的某些示例内容,而不是输入文件的名称)。
答案 2 :(得分:0)
这是您要尝试做的事情吗(将GNU awk用于多字符RS)?
$ echo "$f" | awk -v RS='\\s+' 'sub(/_A\.dedup\.sorted\.bam$/,"_A")'
HDAC3_CTRL_Diff-D0_A