使用awk显示文本而不是打开文件

时间:2019-03-21 11:28:20

标签: awk

我有一个文件名列表-由

模拟
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)

我不希望它打开任何文件。我只想解析列表以生成一个截断的字符串。

3 个答案:

答案 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