分裂CSV文件,并在输出使用bash不含柱,用sed或AWK(Splitting CSV file

2019-09-16 15:01发布

我有一个包含类似下面的数据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等?

Answer 1:

下面是一个衬为您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]

固定:

所以,如果你愿意,而不是一个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。



Answer 2:

您可以使用此awk命令:

awk -F, 'BEGIN{OFS=",";} {dt=$8; gsub(/^"| .*"$/,"", dt);
$1=""; sub(/^,/, "", $0); print $0 > dt}' input.txt


Answer 3:

这怪物抓住所有的唯一日期,然后里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


Answer 4:

脚本语言(的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


Answer 5:

它必须是简单

$ sed 's/^[0-9]*,//' your_gigantic_data.csv


Answer 6:

这可能会为你工作:

sed 's/^[^,]*,\(.*"\(....\)-\(..\)-\(..\).*\)/echo \1 >>\2_\3_\4.csv/' file | sh

或GNU sed的:

sed 's/^[^,]*,\(.*"\(....\)-\(..\)-\(..\).*\)/echo \1 >>\2_\3_\4.csv/e' file


文章来源: Splitting CSV file and excluding column in output using bash, sed or awk