有一个如下格式的表格。是否可以使用 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/