【问题标题】:Remove string after second underscore with AWK使用 AWK 删除第二个下划线后的字符串
【发布时间】:2019-12-22 02:17:35
【问题描述】:

我正在尝试使用 AWK 删除第二列中第二个下划线之后的字符串。

这是我的输入数据:

OTU10015    uncultured_Ascomycota_C31_F02_Lineage=Root  Fungi
OTU10071    Fusarium_sp._NRRL_52720_Lineage=Root    Fungi
OTU10082    Colletotrichum_dematium_BBA_62147_Lineage=Root  Fungi

预期的输出是:

OTU10015    uncultured_Ascomycota   Fungi
OTU10071    Fusarium_sp.    Fungi
OTU10082    Colletotrichum_dematium   Fungi

我试过这段代码:

awk '{sub(/([^_]).*/,"",$2);print $1,$2,$3}' file1> file2

我从另一个帖子中找到了这段代码并尝试修改它, 但它会删除整个第二列。

如何进一步修改代码?提前致谢!

【问题讨论】:

  • 也许你想用 [^\s]* 替换 .*(匹配任何东西)(匹配除空格或制表符之外的任何东西)
  • regex101.com 可以方便地测试正则表达式。我觉得你在这里的正则表达式很奇怪。
  • ^([^\s_]*_[^\s_]*).* 应该做的工作
  • 我的错误对不起......然后你需要使用gensub
  • 如果你不能在 awk 中使用捕获的组......我不能帮助你......无论如何我讨厌 awk,更喜欢使用 perl 来轻松完成这项工作

标签: awk


【解决方案1】:

当您拥有像 split() 这样可以轻松解决问题的函数时,使用基于正则表达式的方法和 sub() 似乎是一种错误的方法。

您只需使用split() 函数在_ 上进行拆分,并且只使用前两个单词。在不影响文件中其他字段的情况下,这是尽可能少的。

awk '{ split($2, arr, "_"); $2=arr[1]"_"arr[2] }1' file

当您只修改一条记录时,很少需要使用print 手动打印字段。执行{ .. }1 会根据行中任何字段的修改重新构建整行。由于只修改了$2,整行都用修改重构了。

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多