Parsing AWK-循环浏览一个大型CSV文件并打印一个新的CSV,其中包含符合条件的记录

Parsing AWK-循环浏览一个大型CSV文件并打印一个新的CSV,其中包含符合条件的记录,parsing,csv,awk,criteria,Parsing,Csv,Awk,Criteria,我试图解析一个大的CSV(大约90MB),它有一个头部分(130行,单列)。第131行是列标题,其中包含单个列的名称(总共20列) 我不需要解析前9列,从第10列到第20列的数据采用以下格式(为便于查看,重新格式化为列,但下面的每一行实际上位于CSV中的单个列中) 0/0:3,0:9:0,9,90 ./ 0/1:6,3:49:73,0111 0/1:13,3:99:103,0254 0/1:6,6:45:56,3124 0/1:2,2:34:43,0,51 0/1:80,0:87:252,518

我试图解析一个大的CSV(大约90MB),它有一个头部分(130行,单列)。第131行是列标题,其中包含单个列的名称(总共20列)

我不需要解析前9列,从第10列到第20列的数据采用以下格式(为便于查看,重新格式化为列,但下面的每一行实际上位于CSV中的单个列中)

0/0:3,0:9:0,9,90

./

0/1:6,3:49:73,0111

0/1:13,3:99:103,0254

0/1:6,6:45:56,3124

0/1:2,2:34:43,0,51

0/1:80,0:87:252,51882

0/1:25,12:99:1392863281

./

0/1:6,8:64:64,0130

0/1:4,5:65:109,0114

以“0/0:3,0:9:0,9,90”为例,标准是:如果高亮显示的两个数字(3,0)相加>=20,第二个数字(0)大于或等于10,则将其打印到新CSV。如果未通过标准,只需在新CSV中打印“/”。已具有“/”的单元格将保留在新CSV中的“/”

我在这个帖子中问了一部分问题,多亏了Kent,我现在知道如何将标准应用于单个单元格,但我需要循环10列并应用相同的标准。下面是我想到的,但显然,我需要更多的帮助来完成这个。如有任何帮助/建议,将不胜感激

BEGIN {
-F'\t'; -v OFS='\t'

for (i=10; i<=20; i++)   
 {
  t=$i; 
  split(t,a,/[:,]/)}(a[2]+a[3])>=20 && a[3]>=10
  }

}
开始{
-F'\t';-v OFS='\t'
对于(i=10;i=20&&a[3]>=10
}
}

如果您的问题包含来自给定输入的示例输出,这将有助于提供准确答案。但总体而言,您非常接近您的解决方案……除了……
(t,a,/[:,]/)}
?开头的“{”字符在哪里?您的不平衡度为
{
}
s在您的代码中。您应该会收到一条错误消息,根据哪个awk,它很可能会指出它无法解析的内容

BEGIN { -F"\t"; OFS="\t" }
# -----------missing ----^--
# awk doesn't like '\t' quoting, use "\t"
# the -v is only for the command line, not in a BEGIN block

# awk executes whatever is inside a { } block like illustrated below
# for each line of data in the file
# 
# not clear if this is what you want
{
# --- note, missing opening { char

    for (i=10; i<=20; i++) {
      t=$i; 
      #old ver split(t,a,/[:,]/)}(a[2]+a[3])>=20 && a[3]>=10
      # new
      split(t,a,/[:,]/)
       if ( (a[2]+a[3])>=20 && a[3]>=10 ) {
          printf("%s\t", $i)
       }  # end if
     }    # end for i
     printf("\n")
}         # end awk loop 
          # that processes each line
          # of data from a a file    
BEGIN{-F“\t”;OFS=“\t”}
#--------失踪----^--
#awk不喜欢“\t”引用,请使用“\t”
#-v仅用于命令行,不在BEGIN块中
#awk执行{}块中的任何内容,如下图所示
#对于文件中的每一行数据
# 
#不清楚这是否是你想要的
{
#---注意,缺少开头{char
对于(i=10;i=20&&a[3]>=10
#新的
拆分(t,a,/[:,]/)
如果((a[2]+a[3])>=20&&a[3]>=10){
printf(“%s\t”,$i)
}#如果需要,则结束
}#我就这样结束了
printf(“\n”)
}#结束awk循环
#它处理每一行
#从文件中删除数据
要打印一行的一部分,我理解您的问题,您必须依赖更精细的
awk
printf(“%s”,“string”)功能。请注意,我将
$I
作为要打印的参数,您可能需要使用一个数组变量
a[2]
或其他任何东西

IHTH