Replace 使用gawk将特定列替换为特定值

Replace 使用gawk将特定列替换为特定值,replace,awk,gawk,Replace,Awk,Gawk,我试图找到我的数据在第2列中有一个90,上面两行改变了第2列的值。例如,在我下面的数据中,如果我在第11行看到90,我想将第9行的第2列值从11更改为5。我有一组预定的值,我想将数字更改为;值始终分别为10,11,12,30,31,32到1,2,3,4,5,6 我的数据 # Type Response Acc RT Offset 1 70 0 0 0.0000 57850 2 31 0

我试图找到我的数据在第2列中有一个90,上面两行改变了第2列的值。例如,在我下面的数据中,如果我在第11行看到90,我想将第9行的第2列值从11更改为5。我有一组预定的值,我想将数字更改为;值始终分别为10,11,12,30,31,32到1,2,3,4,5,6

我的数据

 #      Type    Response        Acc     RT      Offset    
   1      70  0    0   0.0000 57850
   2      31  0    0   0.0000 59371
   3      41  0    0   0.0000 60909
   4      70  0    0   0.0000 61478
   5      31  0    0   0.0000 62999 
   6      41  0    0   0.0000 64537
   8      70  0    0   0.0000 65106
   9      11  0    0   0.0000 66627
  10      21  0    0   0.0000 68165
  11      90  0    0   0.0000 68700
  12      31  0    0   0.0000 70221
我想要什么

 #      Type    Response        Acc     RT      Offset    
   1      70  0    0   0.0000 57850
   2      31  0    0   0.0000 59371
   3      41  0    0   0.0000 60909
   4      70  0    0   0.0000 61478
   5      31  0    0   0.0000 62999 
   6      41  0    0   0.0000 64537
   8      70  0    0   0.0000 65106
   9       5  0    0   0.0000 66627
  10      21  0    0   0.0000 68165
  11      90  0    0   0.0000 68700
  12      31  0    0   0.0000 70221
我一直试图存储前一行并将其用作参考,但我只能返回一行,需要返回两行。谢谢您的帮助。

这应该可以:

function pra(a) {
  for(e in a) {
    printf "%s ", a[e];
  }
  print ""; 
}
BEGIN {
  vals[10] = 1;
  vals[11] = 2;
  vals[12] = 3;
  vals[30] = 4;
  vals[31] = 5;
  vals[32] = 6;
}
NR == 1 { split($0, a, " ") }
NR == 2 { split($0, b, " ") }
NR > 2 { 
  if($2 == "90") {
    a[2] = vals[a[2]];
  }
  pra(a);
  al = 0;
  for(i in a) al++;
  for(i = 1; i <= al; i++) {
    a[i] = b[i];
  }
  split($0, b, " ");
}
END {
  pra(a);
  pra(b);
}
您可以这样做:

function pra(a) {
  printf "%4d%8d%3d%5d%9.4f%6d\n", a[1], a[2], a[3], a[4], a[5], a[6]
}
BEGIN {
  vals[10] = 1;
  vals[11] = 2;
  vals[12] = 3;
  vals[30] = 4;
  vals[31] = 5;
  vals[32] = 6;
}
NR == 1 { print }
NR == 2 { split($0, a, " ") }
NR == 3 { split($0, b, " ") }
NR > 4 {
  if($2 == "90") {
    a[2] = vals[a[2]];
  }
  pra(a);
  for(i = 1; i <= 6; i++) {
    a[i] = b[i];
  }
  split($0, b, " ");
}
END {
  pra(a);
  pra(b);
}
这应该起作用:

function pra(a) {
  for(e in a) {
    printf "%s ", a[e];
  }
  print ""; 
}
BEGIN {
  vals[10] = 1;
  vals[11] = 2;
  vals[12] = 3;
  vals[30] = 4;
  vals[31] = 5;
  vals[32] = 6;
}
NR == 1 { split($0, a, " ") }
NR == 2 { split($0, b, " ") }
NR > 2 { 
  if($2 == "90") {
    a[2] = vals[a[2]];
  }
  pra(a);
  al = 0;
  for(i in a) al++;
  for(i = 1; i <= al; i++) {
    a[i] = b[i];
  }
  split($0, b, " ");
}
END {
  pra(a);
  pra(b);
}
您可以这样做:

function pra(a) {
  printf "%4d%8d%3d%5d%9.4f%6d\n", a[1], a[2], a[3], a[4], a[5], a[6]
}
BEGIN {
  vals[10] = 1;
  vals[11] = 2;
  vals[12] = 3;
  vals[30] = 4;
  vals[31] = 5;
  vals[32] = 6;
}
NR == 1 { print }
NR == 2 { split($0, a, " ") }
NR == 3 { split($0, b, " ") }
NR > 4 {
  if($2 == "90") {
    a[2] = vals[a[2]];
  }
  pra(a);
  for(i = 1; i <= 6; i++) {
    a[i] = b[i];
  }
  split($0, b, " ");
}
END {
  pra(a);
  pra(b);
}

此版本保留您的原始格式

awk 'BEGIN{ new[" 1"]="10"; new[" 2"]="11"; new[" 3"]="12"
            new[" 4"]="30"; new[" 5"]="31"; new[" 6"]="32" }
     { line[-2]=line[-1]; line[-1]=line[0]; line[0]=$0 } 
     $2==90 { if( match( line[-2], /^ *[0-9]+ +[1-6] / ) ) { 
                  old=substr( line[-2], RLENGTH-2,2 )
                  line[-2]=substr( line[-2], 1, RLENGTH-3 ) new[old] \
                           substr( line[-2], RLENGTH ) } }
     NR>2 { printf("%s\n",line[-2]) } 
     END { printf("%s\n%s\n",line[-1],line[0]) }' file.in

此版本保留您的原始格式

awk 'BEGIN{ new[" 1"]="10"; new[" 2"]="11"; new[" 3"]="12"
            new[" 4"]="30"; new[" 5"]="31"; new[" 6"]="32" }
     { line[-2]=line[-1]; line[-1]=line[0]; line[0]=$0 } 
     $2==90 { if( match( line[-2], /^ *[0-9]+ +[1-6] / ) ) { 
                  old=substr( line[-2], RLENGTH-2,2 )
                  line[-2]=substr( line[-2], 1, RLENGTH-3 ) new[old] \
                           substr( line[-2], RLENGTH ) } }
     NR>2 { printf("%s\n",line[-2]) } 
     END { printf("%s\n%s\n",line[-1],line[0]) }' file.in

哇,谢谢你这么快回复。我试过你的代码,是否可以像我上面展示的那样保留数据的格式?当我运行您的代码时,它给了我一个重新排列了数据和标题的输出(Acc RT Offset#Type Response 0 0.0000 43991 1 1 55 0)。另外,有没有可能给我一个代码运行的详细情况?另外,非常感谢,它在很大程度上起了作用。谢谢-请参阅编辑,希望它能为您提供一些解决方法。注意:当所涉及的字段不在列表中时,它会造成错误的替换
10,11,12,30,31,32
。。。它用
0
替换任何数字。。。他提到给定的列表有明确的替代项,但我不确定他的意思是列表包含唯一可能的值。。。(如果还有其他值的话,值得一提)。非常感谢,第二段代码让我保留了格式。我的价值观都是10,11,12,30,31,32,所以这部分没有问题,但感谢您的关注,我将在未来关注它们。也谢谢你的分类,这是非常有帮助的。哇,谢谢你回复这么快。我试过你的代码,是否可以像我上面展示的那样保留数据的格式?当我运行您的代码时,它给了我一个重新排列了数据和标题的输出(Acc RT Offset#Type Response 0 0.0000 43991 1 1 55 0)。另外,有没有可能给我一个代码运行的详细情况?另外,非常感谢,它在很大程度上起了作用。谢谢-请参阅编辑,希望它能为您提供一些解决方法。注意:当所涉及的字段不在列表中时,它会造成错误的替换
10,11,12,30,31,32
。。。它用
0
替换任何数字。。。他提到给定的列表有明确的替代项,但我不确定他的意思是列表包含唯一可能的值。。。(如果还有其他值的话,值得一提)。非常感谢,第二段代码让我保留了格式。我的价值观都是10,11,12,30,31,32,所以这部分没有问题,但感谢您的关注,我将在未来关注它们。同样感谢您提供的帮助。您的翻译顺序
10,11,12,30,31,32
1,2,3,4,5,6
与您将
11
更改为
5
的要求不符。您的翻译顺序
10,11,12,30,31,32
1,2,3,4,5,6
与您的要求不符将
11
更改为
5