从第一行填补空行

问题描述:

我有选项卡DELIM文件中像如下:从第一行填补空行

a 12 17 bac 30 42 
a 15 18 
a 18 22 

我想重复列BAC 30 42剩余的行喜欢如下:

a 12 17 bac 30 42 
a 15 18 bac 30 42 
a 18 22 bac 30 42 

我试过以下命令awk '{$4=$4; $5=$5;$6=$6; print}' file.txt,但它没有对文件做任何修改。我怎样才能在awk中实现这一点。

+1

什么是这里的逻辑是什么?复制第一行倒数第二列和最后一列,如果有一些丢失?这总是如此,或者可能发生只有一列丢失? – fedorqui

+0

@fedorqui我只是想复制“bac 30 42”并在没有值的地方填充后续行。 – Carol

+1

说真的 - 你有** GOT **阅读Arnold Robbins编写的第4版Effective Awk Programming。你所问的问题是绝对基本的,你试图做的事情希望能够解决你的问题(你认为'$ 4 = $ 4'会将$ 4'设置为它在赋值之前没有的值]显示你完全不知道awk语法或语义。不要浪费你的时间把语言结构从帽子里拿出来,希望魔术能够发生,并且只读这本书。 –

$ awk -F"\t" -v OFS="\t" '$4!="" {four=$4; five=$5; six=$6} $0!="" {$4=four; $5=five; $6=six; print $0}' test.in 
a 12 17 bac 30 42 
a 15 18 bac 30 42 
a 18 22 bac 30 42 
+0

它可以工作,但在只有2行的情况下,它会失败。是否可以放入for循环,以便它自动识别行数并根据它填充 – Carol

+0

输入文件末尾有空行。增加'$ 0!=“”'作为修复。 –

+0

是的,你是对的,我纠正它。它工作正常。 – Carol

一个正确的解决方案FWIW:

$ awk 'NR==1{n=split($0,d)} {for (i=1;i<=n;i++) printf "%s%s", (i>NF ? d[i] : $i), (i<n ? OFS : ORS)}' file 
a 12 17 bac 30 42 
a 15 18 bac 30 42 
a 18 22 bac 30 42