awk:使用与字段

时间:2016-10-28 05:46:36

标签: bash csv awk

我有一个非常大的CSV文件input.csv,如下所示:

https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.56, 0.98, 87
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89

我正在尝试根据第一列中的网址将此文件的内容(所有列)保存到单独的文件中。

因此上述代码段的输出应该是两个文件:

https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.56, 0.98, 87
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89

https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89

要根据第一列拆分此文件,我使用的是awk:

awk -F, '{print >> ($1".csv")}' input.csv

但是,由于此错误,我无法保存到基于URL字段的任何文件:

awk: cmd. line:1: (FILENAME=input.csv FNR=1) fatal: can't redirect to `    https://www.youtube.com/watch?v=9t5V_sMVN5I.csv' (No such file or directory)

使用URL样式字符串作为文件名保存文件显然会导致一些错误。许多'/'必须导致文件路径中的问题。

有没有办法使用awk基于第1列($ 1)保存内容,但这样的输出文件命名不同,可能遵循编号为1..N的序列?另一个选择是用一些唯一标识符替换每个URL然后拆分 - 但是我还没有能够编写这个脚本。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

由于第一列的常规格式是=作为唯一标识符后的字符串,我们可以使用

awk -F, '{split($1,a,"="); print > (a[2]".csv")}' input.csv

$ cat b7kKTSVbfdA.csv
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.56, 0.98, 87
https://www.youtube.com/watch?v=b7kKTSVbfdA, 0.66, 0.7, 89

$ cat 9t5V_sMVN5I.csv
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.56, 0.98, 87
https://www.youtube.com/watch?v=9t5V_sMVN5I, 0.66, 0.7, 89

参考:

答案 1 :(得分:0)

因为您的文件名包含' /'性格,你可以使用这种方法打击:

awk -F, '{filename=$1;sub(".*=","",filename);print >> (filename".csv")}' input.csv