如何用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 在右大括号前需要一个额外的分号。
这仅适用于具有缺失值的非连续行。
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 在右大括号前需要一个额外的分号。
这仅适用于具有缺失值的非连续行。