0

我正在尝试解析具有标题部分(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 中。

我已经在这个线程中问了一部分问题,使用 awk 逐行处理 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
  }

}
4

1 回答 1

2

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

于 2013-08-17T22:36:45.450 回答