AWK - 循环浏览大型CSV文件并打印包含通过条件的记录的新CSV

时间:2013-08-16 16:43:36

标签: parsing csv awk criteria

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

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

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

./。

0/1:的 6,3 :49:73,0,111

0/1:的 13,3 :99:103,0,254

0/1:的 6,6 :45:56,3,124

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

0/1:的 80,0 :87:252,5,1882

0/1:的 25,12 :99:139,286,3281

./。

0/1:的 6,8 :64:64,0,130

0/1:的 4,5 :65:109,0,114

以“0/0: 3,0 :9:0,9,90”为例,标准为:如果突出显示的两个数字(3,0)加起来到> = 20并且第二个数字(0)大于或等于10,然后将其打印到新的CSV。如果没有通过标准,只需打印“./。”在新的CSV中。具有“./。”的单元格。已经将保持“./。”在新的CSV中。

我已经在这个帖子use awk to process a csv (tab delimited) line by line中询问了部分问题,并且感谢肯特,我现在知道如何将标准应用于单个单元格,但我需要遍历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
  }

}

1 个答案:

答案 0 :(得分:1)

如果您的问题包含来自给定输入的示例输出,这将有助于提供准确的答案。但总的来说,你非常接近你的解决方案......除了...... (t,a,/[:,]/)}?哪个是开头'{'char?您的代码中存在{} 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    

要仅打印部分内容,我了解您的问题,您必须依赖awk更精细的printf("%s", "string")功能。请注意,我将$i作为要打印的参数传递,您可能需要使用其中一个数组变量a[2]或其他任何内容。

IHTH