使用bash,sed或awk拆分CSV文件并排除输出中的列

gen*_*ion 3 linux csv bash awk sed

我有一个CSV文件,其中包含如下数据: -

1,275,,,275,17.3,0,"2011-05-09 20:21:45"
2,279,,,279,17.3,0,"2011-05-10 20:21:52"
3,276,,,276,17.3,0,"2011-05-11 20:21:58"
4,272,,,272,17.3,0,"2011-05-12 20:22:04"
5,272,,,272,17.3,0,"2011-05-13 20:22:10"
6,278,,,278,17.3,0,"2011-05-13 20:24:08"
7,270,,,270,17.3,0,"2011-05-13 20:24:14"
8,269,,,269,17.3,0,"2011-05-14 20:24:20"
9,278,,,278,17.3,0,"2011-05-14 20:24:26"
Run Code Online (Sandbox Code Playgroud)

该文件包含4432986行数据.

我希望在最后一列的日期基于新文件名拆分文件.

因此,基于上面的数据,我希望每个文件中每天有6个新文件.

我想要以YYYY_MM_DD格式命名的文件.

我还想忽略输出数据中的第一列

因此,文件2011_05_13将包含以下行,并排除第一列: -

272,,,272,17.3,0,"2011-05-13 20:22:10"
278,,,278,17.3,0,"2011-05-13 20:24:08"
270,,,270,17.3,0,"2011-05-13 20:24:14"
Run Code Online (Sandbox Code Playgroud)

我打算在linux机器上这样做,所以使用任何Linux实用程序的任何东西都会很酷,sed awk等?

Ste*_*eve 5

这里有一个单行为您awk:

awk -F "," '{ split ($8,array," "); sub ("\"","",array[1]); sub (NR,"",$0); sub (",","",$0); print $0 > array[1] }' file.txt

实现了所需的输出,尽管这些代码中的某些代码可能会更加简洁.HTH.

编辑:

从左到右阅读代码:

  • -F ","
    是的,这设置了分隔符.

  • split ($8,array," ")
    这将拆分空间上的第八列,并将此信息放入一个名为的数组中array.

  • sub ("\"","",array[1])
    我们取第一个数组元素(这是一个将成为我们输出文件名的切片)并替换掉前导"符号(我们需要转义"符号,因此我们将\字符放在前面).

  • sub (NR,"",$0)
    这样可以方便地从文件的开头删除行号(NR行号$0,当然是分隔前的整行输入).

  • sub (",","",$0)
    这将删除行号后面的逗号.

  • 现在我们有一个干净的文件名和一行干净的数据,我们可以写信$0array[1]:print $0 > array[1].

固定:

因此,如果您更喜欢下划线而不是下划线,我们需要解决的是array[1].我刚刚在全球替代中添加:gsub ("-","_",array[1]).

更新的代码是:

awk -F "," '{ split ($8,array," "); sub ("\"","",array[1]); gsub ("-","_",array[1]); sub (NR,"",$0); sub (",","",$0); print $0 > array[1] }' file.txt

HTH.