2016-05-23 132 views
-1

我有一个包含数千条记录的CSV文件。每个记录都用逗号分隔,每个记录114列。awk从最后一列开始在csv文件中打印列

我需要打印4列:89,90,91,92,但列87和86是单引号,可能有逗号或特殊字符,在我的知识中,使用awk来提取这样的列变得复杂。

我认为使用awk可能会更简单,并从记录的末尾开始提取这些列:从记录的最后一列开始提取第23,24,25,26列,其中最后一列内没有逗号存在。

让我知道你是否可以提供任何帮助。

输入记录示例:{144361,1 ,,,,,,,,,,,,'video14.ams01.hls。','http://video14.ams01.hls.ttvnw.net/hls-826494/wolfontwitchtv_16706535008_316775727/mobile/py-index-live.m3u8?token=id=9043516345222409985,bid=16706535008,exp=1443697094,node=video14-1.ams01.hls.justin.tv,nname=video14.ams01,fmt=mobile&sig=af9c82188126e ...','AppleCoreMedia/1.0.0.12B436(iPhone ; U; CPU OS 8_1_1,如Mac OS X; en_us)',第89列,第90列,第91列,第92列,'ios','iPhone',298209470,1 ,,,,,,,,, 1,1,1, ,}

预期结果: {column89,column90,column91,column92}

THX。

+0

你怎么行看起来像任何的例子吗? – SMA

+1

您的问题使用'{}'按钮来正确格式化您的示例输入,并提供给定输入的预期输出。我们也不需要通过其中的100个领域来理解概念,并且希望尽可能地让我们理解您的问题,让更多的人将时间投入到尝试帮你。还包括你迄今为止所尝试的内容 - 参见[问]。 –

回答

0

听起来像所有你需要的是:

awk 'BEGIN{FS=OFS=","; d=114-88} {for (i=1;i<=4;i++) printf "%s%s", $(NF-d+i), (i<4?OFS:ORS)}' file 

,但你的样品输入/输出不足以告诉因此借用@ karakfa的样品输入打印领域5和6是:

$ cat badcsv 
11,12,13,"14,141,142",15,16,17 
21,22,23,24,25,26,27 

$ awk 'BEGIN{FS=OFS=","; d=7-4} {for (i=1;i<=2;i++) printf "%s%s", $(NF-d+i), (i<2?OFS:ORS)}' badcsv 
15,16 
25,26 
+0

尝试了下面的代码,但列92后面的字段中的特殊字符阻止获取预期的结果。 Thx –

+0

Thx为您的时间。添加更多细节。下面的兴趣列:{...,'column87','column88',column89,column90,column91,column92,'column93','column94',,,,, ...}。列93和94都是单引号可以包含:{“。“,”_“,” - “,”空格“}列87和88都是单引号可以包含各种各样的特殊字符。列89,90,91,92未被引用并且可以包含空格,例如:{其他ssl},我的目标是得到如下结果:{column89,column90,column91,column92}。希望它可以提供帮助.Thx –

+0

你提到的任何字符都没什么特别之处,它们对这个问题没有影响。这使得这个问题变得更加困难,描述这些列很好,但如果你提供一个[mcve],它会更加有效和有用(因为它给了我们测试的东西),只需编辑你的问题就可以提供例如10个字段的例子,当我在你的问题下面发表评论时,在我的评论中请求,当你第一次发布它时 - 修改发布的例子@karakfa,并在我的答案中使用,显示期望的输出和我的脚本的输出,以便我们可以看到什么错误 –

0

如果您正在使用GAWK版本> 4.0.0:

awk -v FPAT="([^,]+)|(\'[^\']+\')" '{print $89,$90,$91,$92}' File 
+0

嗨7171u,这里是第87列的样本,逗号用单引号分隔和分隔:'http://video14.ams01.hls.ttvnw.net/hls-826494/wolfontwitchtv_16706535008_316775727/mobile/py-index-live.m3u8 ?token = id = 9043516345222409985,bid = 16706535008,exp = 1443697094,node = video14-1.ams01.hls.justin.tv,nname = video14.ams01,fmt = mobile&sig = af9c82188126e ...'它也可以包含任何特殊字符。使用您的解决方案我无法获得请求的结果 –

+0

此解决方案不允许使用空字段,除非将第一个“+”更改为“*”。另外,您不需要在双引号分隔的字符串中转义单引号。你可能也想设置输出字段分隔符:'-v FPAT =“([^,] *)|('[^'] +')”-v OFS =“,”'。 –

0

这里是另一种方法

$ rev badcsv | awk 'BEGIN{OFS=FS=","} {print $2,$3}' | rev 
15,16 
25,26 

其中

$ cat badcsv 
11,12,13,"14,141,142",15,16,17 
21,22,23,24,25,26,27