首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用awk显示文本而不是打开文件

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

Stack Overflow用户
提问于 2019-03-21 11:28:20
回答 3查看 197关注 0票数 0

我有一个文件名列表-由

代码语言:javascript
运行
复制
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"

我在努力

代码语言:javascript
运行
复制
echo $f | awk '/_A/ { echo }' | sed 's/.dedup.sorted.bam//g' 

但我一开始就被困在

代码语言:javascript
运行
复制
awk '/_A/ { echo }' $f 

给了我错误

代码语言:javascript
运行
复制
awk: fatal: cannot open file `HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam' for reading (No such file or directory)

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-21 11:34:22

1解决方案: In awk它不像BASH那样工作,我们有一个单独的print函数,echo不能在其中工作。您可以尝试如下(这将删除从.到最后一行的所有传递变量的所有部分。

代码语言:javascript
运行
复制
echo "$f" | awk '{for(i=1;i<=NF;i++){sub(/\..*/,"",$i);print $i}}'
HDAC3_CTRL_Diff-D0_A
HDAC3_CTRL_Diff-D0_B

第二种解决方案,如果您想查找特定的字符串并从其中移除某些部分,请尝试如下:

代码语言:javascript
运行
复制
echo "$f"  | awk 'match($0,/HDAC3[^ ]*/){val=substr($0,RSTART,RLENGTH);sub(/\..*/,"",val);print val}'
HDAC3_CTRL_Diff-D0_A

或(一种非一元线性溶液形式):

代码语言:javascript
运行
复制
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
   }
'

第三种解决方案:,以防有人想要查找确切的字符串,然后尝试如下。

代码语言:javascript
运行
复制
echo "$f"  | awk 'match($0,/HDAC3_CTRL_Diff-D[0-9]+_A/){print substr($0,RSTART,RLENGTH)}'

第4种解决方案:在不同字段的行中可能出现多次_A,然后尝试如下。

假设变量f具有以下值。

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

现在当我们运行新代码::时

代码语言:javascript
运行
复制
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函数,而是有“`print”。
  • awk,当你试图像awk......$f那样通过时,它意味着你要把一个Input_file传递给它,这不是这样的,所以你不应该这样做。
  • 如果它是要传递给awk并进行处理的文本,则尝试echo "text here...." | awk code here.awk ..... <<<"$var"作为示例。
票数 0
EN

Stack Overflow用户

发布于 2019-03-21 11:36:47

我不确定echo是否存在于awk中,您需要的是print,并且只打印第一个字段$1

代码语言:javascript
运行
复制
$ 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,而不是将变量的内容传递到awkawk的命令行参数被视为文件名。您可以将实际的文件名放在那里,但不能放在这个$f变量(我假设这个变量包含输入文件的一些示例内容,而不是输入文件的名称)。

票数 0
EN

Stack Overflow用户

发布于 2019-03-22 01:55:25

这就是你想要做的(使用GNU awk进行多个字符RS)吗?

代码语言:javascript
运行
复制
$ echo "$f" | awk -v RS='\\s+' 'sub(/_A\.dedup\.sorted\.bam$/,"_A")'
HDAC3_CTRL_Diff-D0_A
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55279451

复制
相关文章

相似问题

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