如何用shell脚本中的下一行内容替换空白处

How to replace the empty place with next line content in shell script

1,n1,abcd,1234 
2,n2,abrt,5666
 ,h2,yyyy,123x
3,h2,yyyy,123y
3,h2,yyyy,1234
 ,k1,yyyy,5234
4,22,yyyy,5234

上面给出的是我的输入文件abc.txt,我只希望缺少的第一列值应该用下一行的第一个值填充。 示例:

3,h2,yyyy,123x
3,h2,yyyy,123y

我想要如下输出,

1,n1,abcd,1234
2,n2,abrt,5666
3,h2,yyyy,123x// the missing first column value 3 should fill with second row first value
3,h2,yyyy,123y
3,h2,yyyy,1234
4,k1,yyyy,5234
4,22,yyyy,5234

如何借助 AWK 或 shell 脚本中的其他替代方法实现此功能,请帮忙。

使用 awk 可以做到:

awk -F, ' ~ /^ *$/ {
   p=p RS [=10=]
   next
}
p!="" {
   gsub(RS " +", RS , p)
   sub("^" RS, "", p)
   print p
   p=""
} 1' file

1,n1,abcd,1234
2,n2,abrt,5666
3,h2,yyyy,123x
3,h2,yyyy,123y
3,h2,yyyy,1234
4,k1,yyyy,5234
4,22,yyyy,5234

我会反转文件,然后替换行的值:

tac filename | awk -F, ' ~ /^[[:blank:]]*$/ { = prev} {print; prev=}' | tac

这也将填补多行的缺失值。

使用 GNU sed:

$ sed '/^ ,/{N;s/ \(.*\n\)\([^,]*\)\(.*\)//}' infile
1,n1,abcd,1234 
2,n2,abrt,5666
3,h2,yyyy,123x
3,h2,yyyy,123y
3,h2,yyyy,1234
4,k1,yyyy,5234
4,22,yyyy,5234

sed 命令执行以下操作:

/^ ,/ {   # If the line starts with 'space comma'
    N     # Append the next line

    # Extract the value before the comma, prepend to first line
    s/ \(.*\n\)\([^,]*\)\(.*\)//
}

BSD sed 在右大括号前需要一个额外的分号。

这仅适用于具有缺失值的非连续行。