Bash AWK:对多列数据填充的操作

Bash AWK:对多列数据填充的操作,bash,awk,multiple-columns,Bash,Awk,Multiple Columns,我正在通过集成到bash脚本(使用数据文件操作)中的以下AWK代码(进行所有统计计算)处理对多列格式的大量数据填充的分析: 并将结果保存在另一个多列输出文件中(对于10个已处理的CSV,它包含10行),其中包含每个已处理CSV名称的一部分(对应的前缀用作行的ID)、其dG(平均值)和dG(最小值): 我需要在代码的AWK部分添加一个可能性,以便在单个列中检测并打印$3(dG)中的值,该值在初始csv的$2(pop列)中具有最大值。在上述示例中,dG的值为-4.1200,根据第二列中检测到的最大数

我正在通过集成到bash脚本(使用数据文件操作)中的以下AWK代码(进行所有统计计算)处理对多列格式的大量数据填充的分析:

并将结果保存在另一个多列输出文件中(对于10个已处理的CSV,它包含10行),其中包含每个已处理CSV名称的一部分(对应的前缀用作行的ID)、其dG(平均值)和dG(最小值):


我需要在代码的AWK部分添加一个可能性,以便在单个列中检测并打印$3(dG)中的值,该值在初始csv的$2(pop列)中具有最大值。在上述示例中,dG的值为-4.1200,根据第二列中检测到的最大数量(150),该值对应于CSV的第四行。因此,目的是将第四列打印到output.csv,该列将包含$3(dG)值,对应于$2(pop)中的最大值。

至于
awk
部分,请尝试:

awk -F ", *" '                  # set field separator to comma, followed by 0 or more whitespaces
FNR==1 {
   if (n) {                     # calculate the results of previous file
      m = s / n                 # mean
      mean[suffix] = m          # store the mean in an array
      lowest[suffix] = min      # lowest value of dG - correspond to the upper number in the original CSV
      highest[suffix] = fourth  # dG of highest pop
   }
   prefix=suffix=FILENAME
   sub(/_.*/, "", prefix)
   sub(/\/[^\/]+$/, "", suffix)
   sub(/^.*_/, "", suffix)
   s = 0                        # sum of $3
   s2 = 0                       # sum of $3 ** 2
   n = 0                        # count of samples
   min = 0                      # lowest value of $3 (assuming all $3 < 0)
   max = 0                      # highest value of $2 (assuming all $2 > 0)
}
FNR > 1 {
   s += $3
   s2 += $3 * $3
   ++n
   if ($3 < min) min = $3       # update the lowest value
   if ($2 > max) {
      max = $2                  # update the highest value
      fourth = $3               # to be printed in the fourth column
   }
}
END {
   if (n) {                     # just to avoid division by zero
      m = s / n
      mean[suffix] = m          # store the mean in an array
      lowest[suffix] = min
      highest[suffix] = fourth  # dG of highest pop
   }
   print "Lig(CNE)", "dG(mean)", "dG(min)", "dG(highest pop)"
   for (i in mean)
      printf "%s %.2f %.2f %.2f\n", i, mean[i], lowest[i], highest[i]
}' *_filt.csv
awk-F“,*”#将字段分隔符设置为逗号,后跟0或更多空格
FNR==1{
如果(n){#计算上一个文件的结果
m=s/n#平均值
平均值[后缀]=m#将平均值存储在数组中
最低[后缀]=最小值#dG的最低值-对应于原始CSV中的上限数字
最高[后缀]=最高流行音乐的第四个#dG
}
前缀=后缀=文件名
sub(/173/,“”,前缀)
子(/\/[^\/]+$/,“”,后缀)
子(/^..*./,“”,后缀)
s=0#总计3美元
s2=0#总金额为$3**2
n=0#样本计数
最小值=0#最低值为$3(假设所有$3<0)
max=0#最高值为$2(假设所有$2>0)
}
FNR>1{
s+=3美元
s2+=$3*$3
++n
如果($3最大值){
max=$2#更新最高值
第四栏=3美元#打印在第四栏
}
}
结束{
如果(n){#只是为了避免被零除
m=序列号
平均值[后缀]=m#将平均值存储在数组中
最低[后缀]=min
最高[后缀]=最高流行音乐的第四个#dG
}
打印“Lig(CNE)”、“dG(平均)”、“dG(最低)”、“dG(最高pop)”
因为(我的意思是)
printf“%s%.2f%.2f%.2f\n”,i,表示[i],最低[i],最高[i]
}'*_filt.csv
  • 将字段分隔符设置为
    将非常重要。否则,数值比较可能会中断
  • 我保留了一些未使用的变量(如s2),它们可能会用于将来的更新计划

非常感谢!只有一个问题“将字段分隔符设置为”,会影响为3美元进行的其他一些计算(例如平均值计算、rmsd等)?简短的回答是
。由于今天正数之间的比较,可能的问题已经变得明显。在不将字段分隔符指定给“,”的情况下,字段在默认字段分隔符(空白字符)上拆分,然后每个字段可能包含尾随逗号,例如
10、
2、
。大多数算术运算(包括负数之间的比较)都会自动截断逗号。正数之间的比较会出现问题,例如
10、
2、
。由于它们看起来像字符串而不是数字,
awk
尝试在它们之间执行字符串比较,结果是
2大于10,
。我在先前的回答中遗漏了潜在的问题。顺便说一句,我已经将选项
-F,
添加到
-F“,*”
,这将删除字段的前导空格,以防万一。好的,非常感谢!我将用>2000个csv填充来运行这个updatejust finished测试的一个简短基准测试,因此使用awk-F“、*”或awk-F”基本上没有区别,因此表明这两个版本都可以完美地工作!干杯
# input *_filt.csv located in the folder 10V1_cne_lig1001
ID, POP, dG
1, 142, -5.6500 # this is dG min
2, 10, -5.5000
3, 2, -4.9500
4, 150, -4.1200 # this is pop(MAX)
# output.csv
Lig(CNE) dG(mean) dG(min)
lig1 -6.78 -7.23
lig2 -5.56 -5.76
lig3 -7.30 -8.69
lig4 -7.98 -8.60
lig5 -6.78 -7.16
lig6 -6.24 -6.50
lig7 -7.44 -8.01
lig8 -4.62 -5.60
lig9 -7.26 -7.48
lig10 -5.9 -6.03
awk -F ", *" '                  # set field separator to comma, followed by 0 or more whitespaces
FNR==1 {
   if (n) {                     # calculate the results of previous file
      m = s / n                 # mean
      mean[suffix] = m          # store the mean in an array
      lowest[suffix] = min      # lowest value of dG - correspond to the upper number in the original CSV
      highest[suffix] = fourth  # dG of highest pop
   }
   prefix=suffix=FILENAME
   sub(/_.*/, "", prefix)
   sub(/\/[^\/]+$/, "", suffix)
   sub(/^.*_/, "", suffix)
   s = 0                        # sum of $3
   s2 = 0                       # sum of $3 ** 2
   n = 0                        # count of samples
   min = 0                      # lowest value of $3 (assuming all $3 < 0)
   max = 0                      # highest value of $2 (assuming all $2 > 0)
}
FNR > 1 {
   s += $3
   s2 += $3 * $3
   ++n
   if ($3 < min) min = $3       # update the lowest value
   if ($2 > max) {
      max = $2                  # update the highest value
      fourth = $3               # to be printed in the fourth column
   }
}
END {
   if (n) {                     # just to avoid division by zero
      m = s / n
      mean[suffix] = m          # store the mean in an array
      lowest[suffix] = min
      highest[suffix] = fourth  # dG of highest pop
   }
   print "Lig(CNE)", "dG(mean)", "dG(min)", "dG(highest pop)"
   for (i in mean)
      printf "%s %.2f %.2f %.2f\n", i, mean[i], lowest[i], highest[i]
}' *_filt.csv