我有一个包含类似下面的数据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"
该文件包含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"
我计划在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]
固定:
所以,如果你愿意,而不是一个hypon下划线,我们需要解决的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。
您可以使用此awk命令:
awk -F, 'BEGIN{OFS=",";} {dt=$8; gsub(/^"| .*"$/,"", dt);
$1=""; sub(/^,/, "", $0); print $0 > dt}' input.txt
这怪物抓住所有的唯一日期,然后里grep在原始文件将它们保存到该密钥文件名为这些密钥。 是的,无用的使用猫,而是试图雾化动作。
cat records.txt \
| cut -f8 -d, \
| cut -f1 -d ' ' \
| tr -d '"' \
| sort -u \
| while read DATE ; do \
cat records.txt \
| cut -f2- -d, \
| egrep ",\"${DATE} [0-9]{2}:[0-9]{2}:[0-9]{2}\"" \
> ${DATE}.txt
done
脚本语言(的Perl / Python)的很可能是这里对您最好的选择,但我喜欢在bash这样的挑战,所以在这儿呢。
cat bigfile.txt | while read LINE;
do echo $LINE >> `echo $LINE | cut -d, -f8 | cut -c2-11`.txt ;
done
基本上,这是什么做的是读取由该行的文件中的行while
循环,然后追加该行基于日期的文件。
该日期与两者的组合拉出cut
命令。 第一cut
拉动的最后一列(第8列)关闭使用逗号分隔符( -d,
那么第二cut
通过去除第一拉刚日期"
,然后啜最多字符11。
现在,应对除去第一列:
cat bigfile.txt | sed 's/^.*?,//'
这正则表达式只是删除第一个逗号之前的一切。
因此,我们将取代我们这个while循环的开始,留给我们:
cat bigfile.txt | sed 's/^.*?,//' | while read LINE;
do echo $LINE >> `echo $LINE | cut -d, -f8 | cut -c2-11`.txt ;
done
它必须是简单
$ sed 's/^[0-9]*,//' your_gigantic_data.csv
这可能会为你工作:
sed 's/^[^,]*,\(.*"\(....\)-\(..\)-\(..\).*\)/echo \1 >>\2_\3_\4.csv/' file | sh
或GNU sed的:
sed 's/^[^,]*,\(.*"\(....\)-\(..\)-\(..\).*\)/echo \1 >>\2_\3_\4.csv/e' file