美好的一天!
使用bash,如果满足以下条件,如何将第四个字段中的记录替换为9010:
注意: 固定宽度
60000123456789100002130G7 2.01408190151529E+28 1E+31 1000
60000023456789100002130G7 2.01408190151529E+28 1E+31 1050
答案 0 :(得分:1)
使用awk
,假设你的意思是连续5个0:
awk '/^[1-9]{,2}0{5}[^0]/{$4=9010}1' input
在没有任何假设的情况下使用GNU sed
:
sed 'h;s/^\(.......\).*/\1/;s/0//g;/^..$/{x;s/[^ ]*$/9010/;b};x' input
给出:
60000123456789100002130G7 2.01408190151529E+28 1E+31 1000
60000023456789100002130G7 2.01408190151529E+28 1E+31 9010
答案 1 :(得分:1)
$ awk '!(substr($0,2,5)+0){sub($NF"$",9010)} 1' file
60000123456789100002130G7 2.01408190151529E+28 1E+31 1000
60000023456789100002130G7 2.01408190151529E+28 1E+31 9010
答案 2 :(得分:0)
通过awk,
awk '/^.00000.*/{sub(/^.*$/,"9010",$4);}1' file
答案 3 :(得分:0)
这个awk应该可以工作:
awk '{s=substr($0, 1, 7); gsub(/0+/, "", s)} length(s)<=2{$4="9010"} 1' file
60000123456789100002130G7 2.01408190151529E+28 1E+31 1000
60000023456789100002130G7 2.01408190151529E+28 1E+31 9010
使用column -t
获取格式化右侧管道:
awk '{s=substr($0, 1, 7); gsub(/0+/, "", s)} length(s)<=2{$4="9010"} 1' file | column -t
60000123456789100002130G7 2.01408190151529E+28 1E+31 1000
60000023456789100002130G7 2.01408190151529E+28 1E+31 9010
编辑:在不使用column -t
的情况下正确格式化:
awk -v OFS='\t' '{s=substr($0, 1, 7); gsub(/0+/, "", s)} length(s)<=2{$4="9010"}
{for (i=1; i<=NF; i++) printf "%s%s", $i, (i<NF)?OFS:RS}' file
60000123456789100002130G7 2.01408190151529E+28 1E+31 1000
60000023456789100002130G7 2.01408190151529E+28 1E+31 9010
答案 4 :(得分:0)
Avinash Raj和Perreal,为什么你认为五个零是连续的?
Avinash Raj,你为什么忽略第一和第七位?
awk '{ S=substr($0,1,7); gsub("[^0]","",S); if (length(S)==5) $4=9010; print }'
保留格式空间:
1)假设从一个字段到下一个字段有三个空格:
awk '{ S=substr($0,1,7); gsub("[^0]","",S); if (length(S)==5) $4=9010; print $1" "$2" "$3" "$4}'
2)假设输入行末尾有一个非负整数([0-9] +):
awk '{ S=substr($0,1,7); gsub("[^0]","",S); L=$0; if (length(S)==5) sub("[0-9]+$","9010",L); print L}'
3)假设输入行中只有四个字段。
awk '{ S=substr($0,1,7); gsub("[^0]","",S); L=$0; if (length(S)==5) sub($4"$","9010",L); print L}'
4)保留原始的全长空格分隔符:
awk '
{
S=substr($0,1,7)
gsub("[^0]","",S)
if (length(S)!=5) {
print
next
}
$4=9010
N=split($0,GAP,"[^ ]+")
L=""
for(i=1;i<=N;i++) L = L GAP[i] $i
print L
}'