为重复值填写缺少行标签的行

时间:2014-07-04 12:35:08

标签: 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列以及新行的数据, 否则按原样打印该行。输出应如下所示:

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

2 个答案:

答案 0 :(得分:1)

我对这个问题的解释是,字段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的非归零,但我们可以很容易地适应只添加缺少的字段。

答案 1 :(得分:0)

我会解决这个固定宽度问题。 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

只需将c更改为您要检查的缺失列的值。