csv - 将 CSV 拆分为包含一组唯一字段值的多个文件

标签 csv awk split conditional-statements find-occurrences

作为 awk 的初学者,我能够通过

分割具有唯一值的数据

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

但我想根据附加条件(即特定列中唯一值的出现)拆分大型 CSV 文件。

具体来说,有输入

111,1,0,1
111,1,1,1
222,1,1,1
333,1,0,0
333,1,1,1
444,1,1,1
444,0,0,0
555,1,1,1
666,1,0,0

我希望输出文件是

111,1,0,1
111,1,1,1
222,1,1,1
333,1,0,0
333,1,1,1

444,1,1,1
444,1,0,1
555,1,1,1
666,1,0,0

每个都包含三个(在本例中)第一列中的唯一值,分别为111,222,333444,555,666。 任何帮助将不胜感激。

最佳答案

这就能解决问题,我发现它非常可读且易于理解:

awk -F',' 'BEGIN { count=0; filename=1 }
            x[$1]++==0 {count++}
            count==4 { count=1; filename++}
            {print >> filename".csv"; close(filename".csv");}' file

我们从计数 0 开始,文件名从 1 开始。然后,我们对从第一列获得的每个唯一值进行计数,每当出现第四个值时,我们就会重置计数并移至下一个文件名。

这是我使用的一些示例数据,这只是您的数据,还有一些附加行。

~$ cat test.txt
111,1,0,1
111,1,1,1
222,1,1,1
333,1,0,0
333,1,1,1
444,1,1,1
444,0,0,0
555,1,1,1
666,1,0,0
777,1,1,1
777,1,0,1
777,1,1,0
777,1,1,1
888,1,0,1
888,1,1,1
999,1,1,1
999,0,0,0
999,0,0,1
101,0,0,0
102,0,0,0

像这样运行 awk:

~$ awk -F',' 'BEGIN { count=0; filename=1 }
            x[$1]++==0 {count++}
            count==4 { count=1; filename++}
            {print >> filename".csv"; close(filename".csv");}' test.txt

我们看到以下输出文件和内容:

~$ cat 1.csv
111,1,0,1
111,1,1,1
222,1,1,1
333,1,0,0
333,1,1,1

~$ cat 2.csv
444,1,1,1
444,0,0,0
555,1,1,1
666,1,0,0

~$ cat 3.csv
777,1,1,1
777,1,0,1
777,1,1,0
777,1,1,1
888,1,0,1
888,1,1,1
999,1,1,1
999,0,0,0
999,0,0,1

~$ cat 4.csv
101,0,0,0
102,0,0,0

关于csv - 将 CSV 拆分为包含一组唯一字段值的多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29261265/

相关文章:

linux - 重击 : Loop a file until it reaches specific number of matching strings and start over

python - 属性错误: 'list' object has no attribute 'split' when i try to split a row from csv file

regex - 在 D 中的未转义字符上拆分字符串

python - 有没有办法找到Python中存在*.csv?

python - 如何在 python 中使用 pandas 分解 csv 中的行?

ruby - 使用 ruby​​ 解析 csv 列以分隔数组

python - 边列表中唯一的节点列表

linux - 在 bash 中计算方差

google-sheets - 将 IMPORTXML Xpath 查询格式化为 Google 表格的可读数据

Read.table()无效多字节字符串错误: Find the strings causing the error