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