Parsing AWK-循环浏览一个大型CSV文件并打印一个新的CSV,其中包含符合条件的记录
我试图解析一个大的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列并应用相同的标准。下面是我想到的,但显然,我需要更多的帮助来完成这个。如有任何帮助/建议,将不胜感激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
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