使用Awk从最后一列开始打印csv文件中的列

使用Awk从最后一列开始打印csv文件中的列,csv,awk,comma,Csv,Awk,Comma,我有一个包含数千条记录的CSV文件。每条记录以逗号分隔,每条记录有114列 我需要打印4列:89、90、91、92,但第87列和第86列是单引号,其中可能包含逗号或特殊字符,据我所知,这使使用awk提取此类列变得复杂 我认为使用awk并从记录的末尾开始提取这样的列可能更简单:从记录的最后一列开始提取第23、24、25、26列,其中最后一列中不存在逗号 如果你能提供任何帮助,请告诉我 输入记录的示例: {144361,1,,,,,,,,,,,,'video14.ams01.hls.','http:

我有一个包含数千条记录的CSV文件。每条记录以逗号分隔,每条记录有114列

我需要打印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 like Mac OS X; en_us)’,column89,column90,column91,column92,’ios','iPhone',298209470,1,,,,,,,,,1,,1,,1,}
预期结果: {column89、column90、column91、column92}


Thx.

如果您使用的是gawk版本>4.0.0:

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

这是另一种方法

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


听起来你所需要的只是:

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

awk'BEGIN{FS=OFS=“,”d=114-88}{for(i=1;您的行是什么样子的?您的问题是使用
{}
按钮,以正确格式化您的示例输入,并提供给定输入的预期输出。此外,还应使其更加简洁,因为我们不需要费力地通过包含100个字段的行来理解概念,您希望我们尽可能轻松地理解您的问题,以便更多的人将时间投入到尝试帮助。还包括您迄今为止尝试过的内容-请参阅。您好7171u,这里是第87列的示例,逗号分隔,也用单引号分隔:“…”它还可以包含任何特殊字符。使用您的解决方案,我无法获得请求的结果此解决方案不允许空字段,除非您更改第一个
+
to a
*
。此外,您不需要在双引号分隔的字符串中转义单引号。您可能还需要设置输出字段分隔符:
-v FPAT=“([^,]*)|('[^']+')”-v OFS=“,”
。尝试了下面的代码,但第92列后面的字段中的特殊字符会阻止获得预期的结果。请稍候。添加更多详细信息。在感兴趣的列下面:{…,'column87','column88',column89,column90,column91,column92,'column93','column94',,,,}。单引号中的第93列和第94列都可以包含:{“,”、“-”,“space”}。第87列和第88列都是单引号,可以包含各种特殊字符。第89、90、91、92列没有引号,可以在其中包含空格,例如:{other ssl}。我的目标是得到以下结果:{column89、column90、column91、column92}。希望能有所帮助。THX你提到的任何字符都没有什么特别之处,它们对这个问题没有任何影响。你让这个问题变得更加困难。描述列很好,但它更有效、更有用(因为它给了我们一些测试依据)如果你提供了一个。只需编辑你的问题,以提供一个例子,例如,当你第一次发布问题时,我在你问题下方的评论中要求提供10个字段-修改示例@karakfa posted和我在回答中使用的,显示预期输出和我脚本的输出,以便我们可以看到错误。最后一次:编辑你的问题,以提供示例,比如说,10列宽,您想打印第7列和第8列,但是我发布的脚本由于字段9的内容而失败。使每列尽可能少的字符长度,刚好足以重现您遇到的问题。保持简单,以便我们易于理解和测试。确定找到了窍门。测试了获得您的代码,设置d=114-87并获得预期结果。考虑破坏结果的特殊字符。Thx
awk 'BEGIN{FS=OFS=","; d=114-88} {for (i=1;i<=4;i++) printf "%s%s", $(NF-d+i), (i<4?OFS:ORS)}' file
$ 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