【问题标题】:How to separate a field ussing awk by letter or end character如何使用 awk 按字母或结束字符分隔字段
【发布时间】:2026-02-12 01:40:01
【问题描述】:

我的数据库中有 2 个字段

ID25333,1429291340lNormPUC-AP_MEX_UFM-GOL_44PUC-AP_VEX_UFM-ROL_55PUCAP_MEX_UFM-DOJ_49
ID55555,1429291340lNormPUC-AP_PPP_UFM-HOL_44PUC-AF_GEX_UJM-SOL_45PUCAP_MEX_UFM-DOJ_59

我需要像这样分开

ID25333,PUC-AP_MEX_UFM-GOL_44     
ID25333,PUC-AP_VEX_UFM-ROL_55
ID25333,PUCAP_MEX_UFM-DOJ_49
ID55555,PUC-AP_PPP_UFM-HOL_44
ID55555,PUC-AF_GEX_UJM-SOL_45
ID55555,PUCAP_MEX_UFM-DOJ_59

具有相同编号的 ID

我使用 AWK 或 grep

awk 'BEGIN{FS="PUC"}{for(i=1;i<=NF;i++)print $(i)}'

任何建议

谢谢!

【问题讨论】:

    标签: linux bash perl awk grep


    【解决方案1】:

    使用 GNU awk:

    $ awk -F, '{gsub(/PUC/, ","); for (i=3;i<=NF;i++)print $1",PUC"$i}' file.db
    ID25333,PUC-AP_MEX_UFM-GOL_44
    ID25333,PUC-AP_VEX_UFM-ROL_55
    ID25333,PUCAP_MEX_UFM-DOJ_49
    ID55555,PUC-AP_PPP_UFM-HOL_44
    ID55555,PUC-AF_GEX_UJM-SOL_45
    ID55555,PUCAP_MEX_UFM-DOJ_59
    

    或者:

    $ awk -F'(,|PUC)' '{for (i=3;i<=NF;i++)print $1",PUC"$i}' file.db
    ID25333,PUC-AP_MEX_UFM-GOL_44
    ID25333,PUC-AP_VEX_UFM-ROL_55
    ID25333,PUCAP_MEX_UFM-DOJ_49
    ID55555,PUC-AP_PPP_UFM-HOL_44
    ID55555,PUC-AF_GEX_UJM-SOL_45
    ID55555,PUCAP_MEX_UFM-DOJ_59
    

    【讨论】:

    • 仅供参考;在这些解决方案中没有什么特定于 gawk 的。
    【解决方案2】:

    如果你喜欢awk

    awk -F, ' -v OFS=','
    {
      id=$1
      split($2,line,"PUC")
      for(i=2;i<=length(line);i++)
        print id,"PUC" line[i]
    }'
    

    【讨论】:

      【解决方案3】:

      对于固定宽度字段使用 GNU awk:

      $ awk -v FIELDWIDTHS="8 15 21 21 21" '{for (i=3;i<=NF;i++) print $1 $i}' file
      ID25333,PUC-AP_MEX_UFM-GOL_44
      ID25333,PUC-AP_VEX_UFM-ROL_55
      ID25333,PUCAP_MEX_UFM-DOJ_49
      ID55555,PUC-AP_PPP_UFM-HOL_44
      ID55555,PUC-AF_GEX_UJM-SOL_45
      ID55555,PUCAP_MEX_UFM-DOJ_59
      

      【讨论】:

        最近更新 更多