arrays - awk 表格格式化解决方案

标签 arrays bash shell unix awk

有一个如下格式的表格。是否可以使用 AWK 脚本来格式化表格,以排除仅包含数字“1”的列?

ST L1 L2 L3 L4 L5
ST2 1 1 1 1 1
ST2 1 0 1 0 1
ST3 1 0 1 0 1
ST3 0 0 1 1 1
ST4 1 0 1 0 1
ST5 1 0 1 0 1
ST6 1 0 1 0 1
ST7 0 0 1 1 1
ST8 0 0 1 0 1
ST9 1 0 1 0 1

输出应如下所示:

ST L1 L2 L4
ST2 1 1 1
ST2 1 0 0
ST3 1 0 0
ST3 0 0 1
ST4 1 0 0
ST5 1 0 0
ST6 1 0 0
ST7 0 0 1
ST8 0 0 0
ST9 1 0 0

我可以理解如何打印一列的逻辑,就像无论结束 block 中 NR 的值是什么,如果它等于每次找到 1 时应该递增的变量,对于给定的列(标题 NR==1 和列 $1 除外),打印该列。我的麻烦在于实际上尝试打印末尾 block 中的列,因为我正在尝试使用数组并且我仍在学习 AWK 和数组。我确信有一些聪明的方法可以做到这一点,尽管甚至不需要使用数组,只需改变 AWK 查看数据的方式。

最佳答案

awk '
NR==FNR {
    if (NR > 1) {
        for (i=1;i<=NF;i++) {
            if ($i != 1) {
                nonOnes[i]
            }
        }
    }
    next
}
{
    ofs=""
    for (i=1;i<=NF;i++) {
        if (i in nonOnes) {
            printf "%s%s", ofs, $i
            ofs=OFS
        }
    }
    print ""
}
' file file
ST L1 L2 L4
ST2 1 1 1
ST2 1 0 0
ST3 1 0 0
ST3 0 0 1
ST4 1 0 0
ST5 1 0 0
ST6 1 0 0
ST7 0 0 1
ST8 0 0 0
ST9 1 0 0

如果您不想在命令行上列出同一文件两次,您可以调整以添加此 BEGIN 部​​分:

BEGIN { ARGV[ARGC] = ARGV[ARGC-1]; ARGC++ } 

关于arrays - awk 表格格式化解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874989/

相关文章:

c - 数组作为函数中的参数

linux - 查找某个时间范围内的文件加上一个附加文件

java - 从文件读取时获取与写入文件不同的字节数组

mysql - bash 脚本中的 SQL 查询问题

bash 从文件中拉出某些行

linux - 为什么 'top | grep > file' 不起作用?

linux - bash 脚本没有在 nohup 中运行,但可以独立运行

linux - 统计文件字数的shell命令

c++ - 将数组传递给函数 C++

python - 如何将写在 *.txt 文件中的单个大数字转换为其单个数字的 numpy 数组?