linux - 使用 awk 命令行组合列

标签 linux bash awk

<分区>

我想使用 awk 合并从第 4 列开始到列末尾的列。

输入:

1   682333  191.858 191517119   C   A   C   A   A   A   C   A   A   A   A   A
2   1862626 71.9275 56032940    A   C   C   C   A   A   A   C   A   C   A   A
3   11957134    155.78  150230950   B   B   B   B   A   B   A   B   A   B   A   B
4   2516482 51.2692 31496569    B   A   A   A   A   A   A   A   A   A   A   A
5   9378200 51.2798 31572927    A   A   B   B   B   A   A   A   A   A   B   A
6   2071534 52.1573 32824318    A   B   A   B   A   B   A   B   B   B   A   B
7   2074633 33.068  19035920    A   A   B   A   A   A   B   A   B   A   B   A
8   7856856 121.811 117540910   A   A   A   A   A   A   A   A   B   A   B   A
9   3741206 2.18574 2169864 A   A   A   A   A   A   A   A   A   A   A   A
10  4411364 12.5959 24191374    C   C   A   C   A   C   C   C   A   C   A   C

输出:

1   682333  191.858 191517119   CA      CA      AA      CA      AA      AA
2   1862626 71.9275 56032940    AC      CC      AA      AC      AC      AA
3   11957134    155.78  150230950   BB      BB      AB      AB      AB      AB
4   2516482 51.2692 31496569    BA      AA      AA      AA      AA      AA
5   9378200 51.2798 31572927    AA      BB      BA      AA      AA      BA
6   2071534 52.1573 32824318    AB      AB      AB      AB      BB      AB
7   2074633 33.068  19035920    AA      BA      AA      BA      BA      BA
8   7856856 121.811 117540910   AA      AA      AA      AA      BA      BA
9   3741206 2.18574 2169864 AA      AA      AA      AA      AA      AA
10  4411364 12.5959 24191374    CC      AC      AC      CC      AC      AC

对了,如果有什么好的awk命令教程的网站,请在这里推荐。

最佳答案

在我的书中,“单行代码”是一个滥用术语,除非代码适合在大约 80 个字符以下的一行中。我认为 awk 代码在对多个语句使用多行格式化时更容易理解。因此,我想出了这个略有不同的代码版本。行中有奇数个字段的情况不需要特殊处理。访问 $(NF+1) 将给出一个空字符串(或零数字)。

awk '{  printf("%s\t%s\t%s\t%s", $1, $2, $3, $4)
        for (i = 5; i <= NF; i += 2)
            printf("\t%s%s", $i, $(i+1))
        print ""
     }' data

从问题中的数据布局来看,原始数据中使用了制表符分隔符,但演示文稿将制表位设置为 4 个空格。因此代码使用制表符作为分隔符。我在示例数据中添加了一行,其中包含:

11  1111111 22.2222 33333333    D   D   W   W   X   X   Y   Y   Z   Z   =

在将制表位设置为 4 进行格式化后,我从中得到的输出加上问题中的数据如下所示:

1   682333  191.858 191517119   CA  CA  AA  CA  AA  AA
2   1862626 71.9275 56032940    AC  CC  AA  AC  AC  AA
3   11957134    155.78  150230950   BB  BB  AB  AB  AB  AB
4   2516482 51.2692 31496569    BA  AA  AA  AA  AA  AA
5   9378200 51.2798 31572927    AA  BB  BA  AA  AA  BA
6   2071534 52.1573 32824318    AB  AB  AB  AB  BB  AB
7   2074633 33.068  19035920    AA  BA  AA  BA  BA  BA
8   7856856 121.811 117540910   AA  AA  AA  AA  BA  BA
9   3741206 2.18574 2169864 AA  AA  AA  AA  AA  AA
10  4411364 12.5959 24191374    CC  AC  AC  CC  AC  AC
11  1111111 22.2222 33333333    DD  WW  XX  YY  ZZ  =

关于linux - 使用 awk 命令行组合列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38277752/

相关文章:

用于运行终端命令并通过终端给出结果的 php 脚本

bash - Bash case 语句中的起始括号有意义吗?

linux - 这行代码在 shell 中是如何工作的?

c++ - 在单独的控制台窗口中打开应用程序

c# - 为 linux 重建 c# 项目

linux - Bash 中的 If then else 文件类型

bash - awk大于小于但在设定范围内

bash - 根据列值将大文件拆分为小文件的有效方法

php - 是什么杀死了这个进程以及如何阻止它这样做

bash - xargs 不适用于内置的 shell 函数