【问题标题】:split but keep the separator for few拆分但保留几个分隔符
【发布时间】:2021-07-14 01:17:11
【问题描述】:

我有一个大文件,其中第一列的格式如下。可以有3-6个不同的id,用“_”隔开

s1_asd_ucsd
b4_asd_id_vu
c10_id_js_uw
d4_sch_vu

我想将此列分成两列。第 2 列包含最后一个 id,第 1 列包含初始 id;像下面这样

s1_asd  ucsd
b4_asd_id   vu
c10_id_js   uw
d4_sch  vu

我知道如何通过以下方式打印最后一列;但不知道如何在保留分隔符的同时打印以前的 id。

awk '{n=split($1, b, "_"); }{  print b[n]}'

【问题讨论】:

    标签: awk split


    【解决方案1】:

    对于您显示的示例,您能否尝试以下操作。使用 GNU awk 编写和测试,应该可以在任何 awk 中工作。

    awk 'match($0,/.*_/){print substr($0,RSTART,RLENGTH-1),substr($0,RSTART+RLENGTH)}' Input_file
    

    简单的解释是:使用awkmatch 函数匹配每行中_ 的最后一次出现,然后在打印其子字符串时在最后一个_ 之前打印以将其删除,然后打印rest行(以及匹配部分和其余部分之间的空间)。

    【讨论】:

      【解决方案2】:

      使用 GNU awk:

      awk 'BEGIN{FS=OFS="_"} {last=$NF; NF--; print $0 "   " last}' file
      

      保存最后一个字段,从当前行移除最后​​一个字段,输出当前行,输出三个空格并追加保存的最后一个字段。

      输出:

      s1_asd ucsd b4_asd_id 似曾相识 c10_id_js uw d4_sch 似曾相识

      见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

      【讨论】:

      • 我的文件来自在多个位置收集的患者样本,因此有时会有多列,第一列是我需要拆分的那一列。我认为 FS=OFS="_" 不适用于此类文件。
      【解决方案3】:

      使用贪婪匹配模式的简单sed 解决方案:

      sed -E 's/(.+)_(.+)/\1   \2/' file
      
      s1_asd    ucsd
      b4_asd_id    vu
      c10_id_js    uw
      d4_sch    vu
      

      【讨论】:

      • 谢谢@anubhava。当我有多个列并且第一列是我想要拆分的列时,我可以使用它吗?
      • 是的,当然这个命令也可以使用sed -E 's/^([^_]+)_(.+)/\1 \2/' file 来满足这样的要求
      猜你喜欢
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多