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等?
这里有一个单行为您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)
这将删除行号后面的逗号.
现在我们有一个干净的文件名和一行干净的数据,我们可以写信$0给array[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.