如果为空,则将CSV字段复制到下一行(同一列)-Bash(最好)

如果为空,则将CSV字段复制到下一行(同一列)-Bash(最好),bash,csv,Bash,Csv,基本上(有点开玩笑地说)我有一个csv文件,格式如下: "ID","Name","Phone Number" "00001","Ricky Stallman","07771111111" "00003","Harrison Ford","07701010101" "00003","Harrison Ford","" "00008","Bob Geldof","07712121212" 当“哈里森·福特”条目再次出现在我的csv中时,旁边没有数字(这只是数据令人烦恼地呈现给我的方式)。我需要cs

基本上(有点开玩笑地说)我有一个csv文件,格式如下:

"ID","Name","Phone Number"
"00001","Ricky Stallman","07771111111"
"00003","Harrison Ford","07701010101"
"00003","Harrison Ford",""
"00008","Bob Geldof","07712121212"
当“哈里森·福特”条目再次出现在我的csv中时,旁边没有数字(这只是数据令人烦恼地呈现给我的方式)。我需要csv以如下方式读取(即将上面一行中的数字复制到下面的字段中):

如果有人有建议,最好是在Bash中?

尝试以下方法:

awk -F',' '$3!~/""/{nbr=$3} {print $1","$2","nbr}' file
如果第三列为“”,则使用最后一个有效值。

尝试以下操作:

awk -F',' '$3!~/""/{nbr=$3} {print $1","$2","nbr}' file

如果第三列为“”,则使用最后一个有效值。

可以使用gawk解决方案:

#!/usr/bin/gawk -f

match($0, /"([^\"]*)".*,"([^"]*)","([^"]*)"/, t) {
    key = t[1] "|" t[2]  ## Or just key = t[2] to be less strict.
    if (!(t[3] == "" && key in a)) {
        a[key] = t[3]
    }
    printf "\"%s\",\"%s\",\"\"%s\"\n", t[1], t[2], a[key]
}
浓缩:

gawk 'match($0, /"([^\"]*)".*,"([^"]*)","([^"]*)"/, t) { key = t[1] "|" t[2]; if (!(t[3] == "" && key in a)) a[key] = t[3]; printf "\"%s\",\"%s\",\"%s\"\n", t[1], t[2], a[key] }' file
输出:

"ID","Name","Phone Number"
"00001","Ricky Stallman","07771111111"
"00003","Harrison Ford","07701010101"
"00003","Harrison Ford","07701010101"
"00008","Bob Geldof","07712121212"

可以使用gawk解决方案:

#!/usr/bin/gawk -f

match($0, /"([^\"]*)".*,"([^"]*)","([^"]*)"/, t) {
    key = t[1] "|" t[2]  ## Or just key = t[2] to be less strict.
    if (!(t[3] == "" && key in a)) {
        a[key] = t[3]
    }
    printf "\"%s\",\"%s\",\"\"%s\"\n", t[1], t[2], a[key]
}
浓缩:

gawk 'match($0, /"([^\"]*)".*,"([^"]*)","([^"]*)"/, t) { key = t[1] "|" t[2]; if (!(t[3] == "" && key in a)) a[key] = t[3]; printf "\"%s\",\"%s\",\"%s\"\n", t[1], t[2], a[key] }' file
输出:

"ID","Name","Phone Number"
"00001","Ricky Stallman","07771111111"
"00003","Harrison Ford","07701010101"
"00003","Harrison Ford","07701010101"
"00008","Bob Geldof","07712121212"

哇!太快了!绝对完美!!这正是我所需要的,节省了我几天的工作时间。我想,如果同一个人的行彼此相邻,或者它会复制另一个人的前一行的号码,这就足够了。既然条目看起来是经过排序的,我想这不会有什么问题。这就足够了:“上面一行中的数字将被复制到下面的字段中”(只要上面一行有一个有效值)。如果我们按照OP所说的字面意思进行计算。是的,它们总是相邻的(幸运的!)@你的konsolbox也很好:)哇!太快了!绝对完美!!这正是我所需要的,节省了我几天的工作时间。我想,如果同一个人的行彼此相邻,或者它会复制另一个人的前一行的号码,这就足够了。既然条目看起来是经过排序的,我想这不会有什么问题。这就足够了:“上面一行中的数字将被复制到下面的字段中”(只要上面一行有一个有效值)。如果我们按照OP所说的字面意思进行计算。是的,它们总是相邻的(幸运的!)@你的konsolbox也很好:)