使用 Awk 从最后一列开始打印 csv 文件中的列
Print columns in csv file starting from last column using Awk
我有一个包含数千条记录的 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,}
预期结果:
{第 89 列,第 90 列,第 91 列,第 92 列}
谢谢。
如果您使用的 gawk 版本 > 4.0.0:
awk -v FPAT="([^,]+)|(\'[^\']+\')" '{print ,,,}' File
这是另一种方法
$ rev badcsv | awk 'BEGIN{OFS=FS=","} {print ,}' | rev
15,16
25,26
哪里
$ cat badcsv
11,12,13,"14,141,142",15,16,17
21,22,23,24,25,26,27
听起来你只需要:
awk 'BEGIN{FS=OFS=","; d=114-88} {for (i=1;i<=4;i++) printf "%s%s", $(NF-d+i), (i<4?OFS:ORS)}' file
但您的示例 input/output 不足以说明,因此借用 @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
我有一个包含数千条记录的 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,}
预期结果: {第 89 列,第 90 列,第 91 列,第 92 列}
谢谢。
如果您使用的 gawk 版本 > 4.0.0:
awk -v FPAT="([^,]+)|(\'[^\']+\')" '{print ,,,}' File
这是另一种方法
$ rev badcsv | awk 'BEGIN{OFS=FS=","} {print ,}' | rev
15,16
25,26
哪里
$ cat badcsv
11,12,13,"14,141,142",15,16,17
21,22,23,24,25,26,27
听起来你只需要:
awk 'BEGIN{FS=OFS=","; d=114-88} {for (i=1;i<=4;i++) printf "%s%s", $(NF-d+i), (i<4?OFS:ORS)}' file
但您的示例 input/output 不足以说明,因此借用 @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