Awk 填充行缺少重复值的行标签

Awk 填充行缺少重复值的行标签,awk,Awk,我有以下意见: printf "Name\tArea\tNumber\tA\tB\tC\n\t\t\tA\tB\tC\n\t\t\tA\tB\tC\n" Name Area Number A B C A B C A B C 如果前3列为空, 我想打印前3列以及新行的数据, 否则按原样打印行。输出应如下所示: pri

我有以下意见:

printf "Name\tArea\tNumber\tA\tB\tC\n\t\t\tA\tB\tC\n\t\t\tA\tB\tC\n"
Name    Area    Number  A       B       C
                        A       B       C
                        A       B       C
如果前3列为空, 我想打印前3列以及新行的数据, 否则按原样打印行。输出应如下所示:

printf "Name\tArea\tNumber\tA\tB\tC\nName\tArea\tNumber\tA\tB\tC\nName\tArea\tNumber\tA\tB\tC\n"
Name    Area    Number  A       B       C
Name    Area    Number  A       B       C
Name    Area    Number  A       B       C

我将把它作为一个固定宽度的问题来解决。GNU awk解决方案:

$ awk '$1~/^ +$/{sub($1,h)}{h=$1}1' FIELDWIDTHS=23 file         
Name    Area    Number  A       B       C
Name    Area    Number  A       B       D
Name    Area    Number  F       G       T
Nam     Zig     BBA     U       Z       x
Nam     Zig     BBA     A       B       D
只需根据需要更改
FIELDWIDTHS
变量以匹配您的数据

另一种更详细的方法是迭代可能缺少的每个字段:

$ awk '{for(i=1;i<=c;i++)if($i=="")$i=h[i]}{for(i=1;i<=c;i++)h[i]=$i}1' c=3 FS='\t' OFS='\t' file
Name    Area    Number  A       B       C
Name    Area    Number  A       B       D
Name    Area    Number  F       G       T
Nam     Zig     BBA     U       Z       x    
Nam     Zig     BBA     A       B       D

$awk'{for(i=1;i我对这个问题的解释是,字段1到3可以出现在文件中的任何位置,其值可能与以前的值不同。因此,我们的想法是复制到目前为止看到的最后一个字段1到3,以便输入:

Name    Area    Number  A       B       C
                        A       B       D
                        F       G       T
Nam     Zig     BBA     U       Z       x
                        A       B       D
将产生以下产出:

Name    Area    Number  A   B   C
Name    Area    Number  A   B   D
Name    Area    Number  F   G   T
Nam Zig BBA U   Z   x
Nam Zig BBA A   B   D
因此,我建议:

awk 'BEGIN {FS=OFS="\t"; hd1=hd2=hd3=""} $1=="" {$1=hd1;$2=hd2;$3=hd3; print; next} {hd1=$1;hd2=$2;hd3=$3; print}' yourfile

好的,我只检查了$1的非空性,但是我们可以很容易地适应只添加缺少的字段。

亲爱的Jaybee,你假设是对的,它完全按照我的要求工作。谢谢:)