Awk 如何打印包含值的列

Awk 如何打印包含值的列,awk,sed,grep,Awk,Sed,Grep,假设我有一个包含以下内容的数据文件: 1 2 3 4 5 67 88 12 32 22 9 99 34 59 86 17 0 78 0 77 11 0 0 0 43 我想要一个代码,在每一列中搜索数字0。如果找到数字0,代码将在单独的文件中打印出整个列 有了这些数据,输出的文件将如下所示: 2 3 4 88 12 32 99

假设我有一个包含以下内容的数据文件:

 1     2     3     4     5
67    88    12    32    22
 9    99    34    59    86
17     0    78     0    77
11     0     0     0    43
我想要一个代码,在每一列中搜索数字0。如果找到数字0,代码将在单独的文件中打印出整个列

有了这些数据,输出的文件将如下所示:

 2     3     4
88    12    32
99    34    59
 0    78     0
 0     0     0     

如果代码不要求我知道确切的列数和/或行数,那就太好了。

这将满足您的需要。它不需要知道存在多少行或列

$ awk 'FNR==NR{for (i=1;i<=NF;i++)if ($i==o)a[i]=1;next} {tab="";for (i=1;i<=NF;i++)if (a[i]){printf "%s%s",tab,$i; tab="\t"};print ""}' file file
2       3       4
88      12      32
99      34      59
0       78      0
0       0       0
$awk'FNR==NR{for(i=1;i
  • 自评sed
  • posix版本so
    ——GNU上的posix

以下是一种使用GNU awk的有趣方式:

解析.awk

输出:

2 3 4
88 12 32
99 34 59
0 78 0
0 0 0
2   3   4
88  12  32
99  34  59
0   78  0
0   0   0
或使用OFS='\t'

awk -f parse.awk pat=0 OFS='\t' infile infile
输出:

2 3 4
88 12 32
99 34 59
0 78 0
0 0 0
2   3   4
88  12  32
99  34  59
0   78  0
0   0   0

按行搜索并保留整行值。请解释您想要什么?我只希望保留那些包含零值的列。对于所有不包含零值的列,我不希望打印它们。按行搜索可以,但如果整行包含零值,我不希望保留整行。基本上,我希望保留行的值搜索零值。如果找到零值,将打印包含零值的列。然后对每列依次执行此操作。这是否有帮助?对于此类任务,您的输入文件设计不是最佳选择。将矩阵转换为面向行的矩阵而不是面向列的矩阵将大大提高性能。
2   3   4
88  12  32
99  34  59
0   78  0
0   0   0