我面临以下问题。我在一个文件中有几行代码,下面有一个示例。位置4-10之间的值可以包含任何值和空格的组合,只有当它是空空间时,它才被替换为0。
#input.txt
014 789000
234455 899800
1213839489404040
在上面的示例行中,我们可以看到在位置4-10之间有空空间。要检查的位置是固定的。我希望能够检查我的文件中的每一行在位置4-10之间是否都有空空格,如果有空空间,我希望能够用0替换它。我在文件中提供了以下所需的输出。
#desired output in the input.txt
0140000000789000 # note that 0 has been added in the position 4-10
2344550000899800 # # note that 0 has been added in the position 7-10
1213839489404040
我能够在下面的代码中执行以下操作。下面的代码只能使用sed命令在指定位置添加值,我希望能够修改这段代码,以便它能够完成上述任务。
有人能帮帮我吗?
我的守则:
#append script
function append_vals_to_line {
insert_pos=$(($1 - 1))
sed -i 's/\(.\{'$insert_pos'\}\)/\1'$2'/' "$3"
}
column_num_to_insert="$1"
append_value ="$2"
input_file_to_append_vals_in ="$3"
append_vals_to_line "$column_num_to_insert" "$append_value" "$input_file_to_append_vals_in"
发布于 2022-02-01 15:31:16
为此,我建议了一个awk
解决方案:
awk '{s = substr($0, 4, 7); gsub(/ /, 0, s); print substr($0, 1, 3) s substr($0, 11)}' file
#input.txt
0140000000789000
2344550000899800
1213839489404040
一个更易读的版本:
awk '{
s = substr($0, 4, 7)
gsub(/ /, 0, s)
print substr($0, 1, 3) s substr($0, 11)
}' file
该命令首先在变量s
中从第4位到第10位获得一个子字符串。然后使用gsub
将每个空格替换为一个0
,最后重新组合和打印整条线。
考虑从参数获取开始和结束位置的awk
命令:
awk -v p1=4 -v p2=10 '{
s = substr($0, p1, p2-p1+1)
gsub(/ /, 0, s)
print substr($0, 1, p1-1) s substr($0, p2+1)
}' file
发布于 2022-02-01 17:22:58
你可以:
awk '
/[[:blank:]]/{
sub(/[[:blank:]]*$/,"") # remove trailing spaces if any
gsub(/[[:blank:]]/,"0") # replace each /[[:blank:]]/ with "0"
} 1' file
或者,你可以这样做:
awk '
length($2) {
$0=sprintf("%s%0*d",$1,16-length($1),$2)
} 1' file
任何一种指纹:
0140000000789000
2344550000899800
1213839489404040
https://stackoverflow.com/questions/70943079
复制相似问题