【问题标题】:AWK - loop through a large CSV file and print a new CSV containing records that pass criteriaAWK - 遍历一个大的 CSV 文件并打印一个新的 CSV,其中包含通过条件的记录
【发布时间】:2013-08-19 03:40:36
【问题描述】:

我正在尝试解析具有标题部分(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 中提出了部分问题,感谢 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
  }

}

【问题讨论】:

    标签: parsing csv awk criteria


    【解决方案1】:

    如果您的问题包含给定输入的示例输出,这将有助于提供准确的答案。但总的来说,你非常接近你的解决方案......除了...... (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    
    

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

    IHTH

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2020-09-18
      • 1970-01-01
      相关资源
      最近更新 更多