我有以下输入:
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
答案 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
更改为您要检查的缺失列的值。