使用bash替换第四个字段中的记录

时间:2014-08-20 06:14:41

标签: bash unix awk grep

美好的一天!

使用bash,如果满足以下条件,如何将第四个字段中的记录替换为9010:

  • 如果第1位和第7位之间的零等于5

注意:   固定宽度

 60000123456789100002130G7   2.01408190151529E+28   1E+31   1000
 60000023456789100002130G7   2.01408190151529E+28   1E+31   1050

5 个答案:

答案 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
}'