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

使用bash替换第四个字段中的记录,bash,unix,awk,grep,Bash,Unix,Awk,Grep,你好 使用bash,如果满足以下条件,如何将第四个字段中的记录替换为9010: 如果第1位和第7位之间的零等于5 注: 固定宽度 60000123456789100002130G7 2.01408190151529E+28 1E+31 1000 60000023456789100002130G7 2.01408190151529E+28 1E+31 1050 使用awk,假设您指的是连续5个0: awk '/^[1-9]{,2}0{5}[^0]/{$4=9010

你好

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


  • 如果第1位和第7位之间的零等于5
注: 固定宽度

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

使用
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
给出:

通过awk

awk '/^.00000.*/{sub(/^.*$/,"9010",$4);}1' file
此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
编辑:在不使用
列-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
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

awk-vofs='\t'{s=substr($0,1,7);gsub(/0+/,“”,s)}length(s)Avinash Raj和Perreal,为什么你认为这五个零是连续的

阿维纳什·拉吉,你为什么忽略第一和第七个数字

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
}'
awk'
{
S=substr($0,1,7)
gsub(“[^0]”,S)
如果(长度)!=5){
打印
下一个
}
$4=9010
N=分割($0,差距,[^]+”)
L=“”

对于(i=1;我在其他一些帖子上看到了关于像这样计算零的问题,OP想要的是第一位和第七位之间的零是否等于5。他想要的是在2到6位有0的行。他不关心第一位或第七位。如果输入行是:
01000023456789100002130G7 2.0148190151529E+28 1,您的命令将不会打印
9010
E+31 1050
即使它在第1位和第7位之间有5个零。尽管OP写道:如果第1位和第7位之间的零等于第5位,第1位和第7位之间的零等于5=
anynumber00000anynumber
所以它会给你5个零的显示,那么我忽略第一位和第七位吗?@Jdamian谢谢,这是可行的。但是我在间距上遇到了一个问题。下面是输出:600001245678910002130G7 2.0148190151529E+281E+311000 600002345678910000230G7 2.0148190151529E+281E+319010@Jdamian谢谢,这行得通。但是我在间距上遇到了一个问题。在原始记录上,是这样的e是字段之间的3个空格,但输出结果为:6000002345678910000230G7 2.01408190151529E+28 1E+31 9010(中间有一个空格)。如何保留原始空格格式?谢谢保留空格格式的过程是:1)按字段打印,用三个空格分隔2)假设第四个字段是最后一个字段,将输入行末尾的数字替换为字符串9010。我将扩展我的答案,以包括此格式问题。@Perreal,我为我的错误感到抱歉——您不要忘记第一位和第七位数字。列-t在我这边不起作用。是否有任何可能的命令来获得正确的格式?ThaNKSY您的意思是
column
二进制文件在您的系统上不可用?它给了我一个错误:filter\u sundr.sh[24]:column:not found这意味着
column
对您不可用。您可以在您的系统上获得它,因为它是一个标准的实用程序。好的,我会尝试。但是没有其他方法可以做到吗?
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
}'
$ 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