首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果awk中的空格具有不同的长度(在解析期间),则无法匹配它们

如果awk中的空格具有不同的长度(在解析期间),则无法匹配它们
EN

Stack Overflow用户
提问于 2021-03-15 16:28:19
回答 1查看 52关注 0票数 0

我使用的是awk (不支持GAWK)。

我在分析一个文件。(我无法格式化问题中的输入和输出,如果有人可以格式化,请支持)

输入文件如下所示:-

代码语言:javascript
复制
Selc   PR  Seq     Salary   Level     Rate  
    2  1x     3x   360020   EXPERT   
       1      2    962010   EXPERT   
       1      5    269050   EXPERT   
       1      6    269060   EXPERT   
   68  1      1    360020   EXPERT   
       1      2    962010   EXPERT   
       1      6    269060   EXPERT   
2      7      7    360020   EXPERT      
  962  1      2    169820   BEGINNER  146
       1      3    267170   BEGINNER  146
       1      1    169810   EXPERT    148
 1005  1      1    360020   EXPERT   
       1      2    962010   EXPERT   
       1      3    962010   EXPERT   
END

守则如下:

代码语言:javascript
复制
        BEGIN {
         Salarylit("Selc,PR,Seq,Salary,Level,Rate",array,",");
         print_array(array)
      }
  /^Selc   PR  Seq  Salary       Level  Rate/ { 
             getline
             array[1]=trim_blank(substr($0,1,5))  #Selc
             array[2]=trim_blank(substr($0,8,4))  #PR
             array[3]=trim_blank(substr($0,14,4)) #Seq
             array[4]=trim_blank(substr($0,20,7)) #Salary
             array[5]=trim_blank(substr($0,29,6)) #Level
             array[6]=trim_blank(substr($0,37,4)) #Rate
             getline
           }
  /^ /   {if(NF!=0)
                {
             print_array(array)
             array[2]=trim_blank(substr($0,8,4)) #SalaryID
             array[3]=trim_blank(substr($0,14,4)) #Seq
             array[4]=trim_blank(substr($0,20,7)) #Salary
             array[5]=trim_blank(substr($0,29,6)) #Level
             array[6]=trim_blank(substr($0,37,4)) #Rate
                }
             }

function print_array(array)
{
    printf("%-6s", array[1])
    printf("%-5s", array[2])
    printf("%-5s", array[3])
    printf("%-8s", array[4])
    printf("%-7s", array[5])
    printf("%-5s", array[6])
    printf("\n");
}

function trim_blank(str){
#trim will remove the SalaryACE & TAB at begining or end of str
  blk=" "
  tab="\t"
  while(1){
    if((substr(str,1,1)==blk)||(substr(str,1,1)==tab)) {str=substr(str,2,(length(str)-1))}
    else if((substr(str,length(str),1)==blk)||(substr(str,length(str),1)==tab)) {str=substr(str,1,(length(str)-1))}
    else {return str}
    }
}

输出应如下:-

代码语言:javascript
复制
Selc   PR  Seq     Salary   Level     Rate  
2      1x     3x   360020   EXPERT   
2      1      2    962010   EXPERT   
2      1      5    269050   EXPERT   
2      1      6    269060   EXPERT   
68     1      1    360020   EXPERT   
68     1      2    962010   EXPERT   
68     1      6    269060   EXPERT   
2      7      7    360020   EXPERT      
962    1      2    169820   BEGINNER  146
962    1      3    267170   BEGINNER  146
962    1      1    169810   EXPERT    148
1005   1      1    360020   EXPERT   
1005   1      2    962010   EXPERT   
1005   1      3    962010   EXPERT
EN

回答 1

Stack Overflow用户

发布于 2021-03-15 21:11:51

我不确定,但我想这就是你想做的:

代码语言:javascript
复制
$ cat tst.awk
BEGIN { OFS="" }
NR==1 {
    sub(/[[:space:]]+$/,"")
    hdr = $0
    while ( match(hdr,/[[:space:]]*[^[:space:]]+[[:space:]]+/) ) {
        wids[++nf] = RLENGTH
        hdr = substr(hdr,1+RLENGTH)
    }
    nf++
}
{
    delete vals

    for (i=1; i<nf; i++) {
        vals[i] = substr($0,1,wids[i])
        $0 = substr($0,1+wids[i])
    }
    vals[nf] = $0

    for (i=1; i<=nf; i++) {
        val = ( (i==1) && (vals[i]~/^[[:space:]]*$/) ? prev[i] : vals[i] )
        gsub(/^[[:space:]]+|[[:space:]]+$/,"",val)
        wid = ( i < nf ? wids[i] : length(val) )

        printf "%-*s%s", wid, val, (i<nf ? OFS : ORS)

        prev[i] = val
    }
}
代码语言:javascript
复制
$ awk -f tst.awk file
Selc   PR  Seq     Salary   Level     Rate
2      1x  3x      360020   EXPERT
2      1   2       962010   EXPERT
2      1   5       269050   EXPERT
2      1   6       269060   EXPERT
68     1   1       360020   EXPERT
68     1   2       962010   EXPERT
68     1   6       269060   EXPERT
2      7   7       360020   EXPERT
962    1   2       169820   BEGINNER  146
962    1   3       267170   BEGINNER  146
962    1   1       169810   EXPERT    148
1005   1   1       360020   EXPERT
1005   1   2       962010   EXPERT
1005   1   3       962010   EXPERT
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66641881

复制
相关文章

相似问题

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