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,你假设是对的,它完全按照我的要求工作。谢谢:)