首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在BASH中将不同长度的多个列合并为一列

在BASH中将不同长度的多个列合并为一列
EN

Stack Overflow用户
提问于 2013-10-19 00:21:52
回答 2查看 934关注 0票数 3

我需要使用BASH将不同长度的列组合成一个列。下面是一个输入文件示例:

代码语言:javascript
运行
复制
11  1 2   3 4   5 6   7 8
12  1 2   3 4   5 6   7 8
13  1 2   3 4   5 6   7 8
14  1 2         5 6   7 8
15  1 2               7 8

我想要的输出:

代码语言:javascript
运行
复制
1
1
1
1
1
3
3
3
5
5
5
5
7
7
7
7
7

输入的数据是对列,如图所示。每对由固定数目的空格分隔。一对列中的值由一个空格分隔。提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-19 01:09:44

使用GNU awk处理固定宽度字段:

代码语言:javascript
运行
复制
$ cat file
1 2   3 4   5 6   7 8
1 2   3 4   5 6   7 8
1 2   3 4   5 6   7 8
1 2         5 6   7 8
1 2               7 8

$ cat tst.awk                          
BEGIN{ FIELDWIDTHS="1 1 1 3 1 1 1 3 1 1 1 3 1 1 1" }
{
    for (i=1;i<=NF;i++) {
        a[NR,i] = $i
    }
}
END {
    for (i=1;i<=NF;i+=4)
        for (j=1;j<=NR;j++)
            if ( a[j,i] != " " ) 
                print a[j,i]
}

$ gawk -f tst.awk file
1
1
1
1
1
3
3
3
5
5
5
5
7
7
7
7
7
票数 4
EN

Stack Overflow用户

发布于 2013-10-20 22:40:34

您可以尝试以下几种方法:

代码语言:javascript
运行
复制
awk -f ext.awk input.txt

其中input.txt是您的输入数据文件,而ext.awk是:

代码语言:javascript
运行
复制
BEGIN {
    ncols=4 # number of columns
    nspc=3  # number of spaces that separates the columns
}
{
    str=$0;
    for (i=1; i<=ncols; i++) {
        pos=match(str,/^([0-9]+) ([0-9]+)/,a)
        if (pos>0) {
           b[NR,i]=a[1]
           if (NR==1) colw[i]=RLENGTH;  #assume col width are given as in first row
        }
        str=substr(str,colw[i]+1+nspc);
    }
}
END {
    for (i=1;i<=ncols;i++)
        for (j=1;j<=NR;j++) {
            if (b[j,i]) print b[j,i];
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19460881

复制
相关文章

相似问题

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