首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用awk提取列范围和重构矩阵

利用awk提取列范围和重构矩阵
EN

Stack Overflow用户
提问于 2017-10-30 18:49:18
回答 2查看 39关注 0票数 0

假设一个文本文件(file1)包含m行字母字符串S (S_1,S_2,.,S_m)。每个S前面都有一个简短的字母数字字符串,充当条形码(此处: foo1、bar7、baz3)。字母字符串S的长度都是相同的。每个S及其前面的条形码用空格分隔。

代码语言:javascript
复制
$ cat file1
foo1 abcdefghijklmnopqrstuvwxyz
bar7 abcdefghijklmnopqrstuvwxyz
baz3 abcdefghijklmnopqrstuvwxyz

假设第二个文件(file2)包含列范围R的n个规范(R_1,R_2,.,R_n)。列范围位于一行上,由空格分隔。每个R_x都小于S,范围的组合长度(即R_1 + R_2 +.+ R_n)也小于S。

代码语言:javascript
复制
$ cat file2
2-11 14-19 23-24

this excellent answer之后,我理解可以通过以下awk命令提取所有S的第一个范围(即R_1),同时保持正确分配条形码:

代码语言:javascript
复制
awk 'NR==FNR{start=$1;lgth=$2;next} {print $1, substr($2,start,lgth)}' FS='-' file2 FS=' ' file1

但是,我不确定如何将awk代码扩展到所有其他范围(这里是: R_2和R_3),并将它们分别附加到增长的矩阵中。

代码语言:javascript
复制
$ sought_outcome
foo1 bcdefghijknopqrswx
bar7 bcdefghijknopqrswx
baz3 bcdefghijknopqrswx

编辑:为了更好地理解,下面是所示的所寻求的输出,从而使空白空间强调连接点:

代码语言:javascript
复制
     2-11       14-19  23-24
foo1 bcdefghijk nopqrs wx
bar7 bcdefghijk nopqrs wx
baz3 bcdefghijk nopqrs wx
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-30 19:15:38

awk去营救!没有任何验证检查!

代码语言:javascript
复制
$ awk 'NR==FNR {printf "%s", "key"; 
                for(i=1;i<=NF;i++) 
                  {split($i,x,"-"); 
                   start[i]=x[1]; 
                   end[i]  =x[2]; 
                   printf "%s", FS $i}; 
                print ""; 
                next} 

               {printf "%s", $1; 
                for(i in start) printf "%s", FS substr($2,start[i],end[i]-start[i]+1); 
                print ""}' range file | 
  column -t


key   2-11        14-19   23-24
foo1  bcdefghijk  nopqrs  wx
bar7  bcdefghijk  nopqrs  wx
baz3  bcdefghijk  nopqrs  wx

或者,没有头和分裂

代码语言:javascript
复制
$ awk 'NR==FNR{for(i=1;i<=NF;i++) 
                 {split($i,x,"-"); start[i]=x[1]; end[i]=x[2]}; 
                  print ""; n=NF; next}
              {printf "%s", $1 FS; 
               for(i=1;i<=n;i++) printf "%s", substr($2,start[i],end[i]-start[i]+1); print ""}' range file   column -t                        

foo1 bcdefghijknopqrswx
bar7 bcdefghijknopqrswx
baz3 bcdefghijknopqrswx

然而,更新,使用剪切/粘贴可能更容易

代码语言:javascript
复制
$ paste -d' ' <(cut -d' ' -f1 file) <(cut -d' ' -f2 file | cut -c$(tr ' ' ',' <range))
foo1 bcdefghijknopqrswx
bar7 bcdefghijknopqrswx
baz3 bcdefghijknopqrswx
票数 1
EN

Stack Overflow用户

发布于 2017-10-31 11:03:40

我想出的结果与@karakfas第二脚本几乎完全相同,但我发现他格式化代码的方式非常难读,所以我想我还是会发布以下内容:

代码语言:javascript
复制
$ cat tst.awk
NR==FNR {
    for (i=1; i<=NF; i++) {
        split($i,range,/-/)
        beg[i] = range[1]
        end[i] = range[2]
    }
    numRanges = NF
    next
}
{
    printf "%s%s", $1, OFS
    for (i=1; i<=numRanges; i++) {
        printf "%s", substr($2,beg[i],(end[i]-beg[i])+1)
    }
    print ""
}

$ awk -f tst.awk file2 file1
foo1 bcdefghijknopqrswx
bar7 bcdefghijknopqrswx
baz3 bcdefghijknopqrswx
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47022297

复制
相关文章

相似问题

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