如何解决根据一列中的值拆分CSV文件,但仅保留1列并另存为TXT
我有一个两列电子表格(以CSV格式保存),如下所示:
COLUMN 1,COLUMN 2
innovation,3-Entrepreneurship
countless,innocent,2-Police
toilet handle,2-Bathroom
née dresses,3-Companies
odorless,2-Sense of Smell
old ideas,3-Entrepreneurship
new income streams,3-Entrepreneurship
Zoë’s food store,3-Companies
many,crime,2-Police
bath room,2-Bathroom
ring,móvíl résumés,3-Companies
musty smell,2-Sense of Smell
good publicity guru,3-Entrepreneurship
Señor,3-Companies
完整的电子表格为6000行(以CSV格式保存,用逗号分隔两列)。除了此处列出的第2列类别外,它还具有其他功能。
如所示,第1列的某些条目由用空格分隔的两个或三个词组成。它们还利用撇号和带重音的字符(这些字符出现在多个类别中,而不仅仅是标题为3-Companies
的类别中)。
您可以下载完整电子表格here的示例。
我想通过第2列中的值将CSV文件拆分为单独的TXT文件。单独的文件将不再是电子表格表格,而只是单词列表。
例如分裂后
在文件 3-Entrepreneurship.txt
innovation
old ideas
new income streams
good publicity guru
在文件 2-Bathroom.txt
中toilet handle
bath room
在文件 2-Police.txt
中innocent
crime
在文件 2-Sense of Smell.txt
odorless
musty smell
在文件 3-Companies.txt
中née dresses
Zoë’s food store
móvíl résumés
Señor
这只是一个示例。完整文件具有5个以上的类别(在第2列中),因此拆分后的文件将超过5个。
到目前为止,这是我的代码:
awk -F "," '{print $0 >> ($2 ".txt"); close($2 ".txt")}' test.csv
它可以工作,但是有一些问题:
-
文件名最后以问号打印出来。 例如。
2-Police?.txt
3-Entrepreneurship?.txt
-
文件显示为两列。
例如,在 3-Entrepreneurship.txt 中,它具有以下数据:
innovation 3-Entrepreneurship
ideas 3-Entrepreneurship
income 3-Entrepreneurship
publicity 3-Entrepreneurship
解决方法
tail -n +2 file |
sort -t',' -k2 |
awk -F',' '$2~/^[[:space:]]*$/{next} {sub(/\r$/,"")} $2!=prev{close(out); out=$2".txt"; prev=$2} {print $1 > out}'
为了提高效率,我们首先对数据进行排序,这样awk不必逐行打开/关闭文件,而是每个$ 2唯一值执行一次打开/关闭文件。
脚本在这里工作:
$ ls
file
$ cat file
COLUMN 1,COLUMN 2
innovation,3-Entrepreneurship
countless,innocent,2-Police
toilet handle,2-Bathroom
née dresses,3-Companies
odorless,2-Sense of Smell
old ideas,3-Entrepreneurship
new income streams,3-Entrepreneurship
Zoë’s food store,3-Companies
many,crime,2-Police
bath room,2-Bathroom
ring,móvíl résumés,3-Companies
musty smell,2-Sense of Smell
good publicity guru,3-Entrepreneurship
Señor,3-Companies
。
$ tail -n +2 file | sort -t',' -k2 | awk -F',"")} $2!=prev{close(out); out=$2".txt"; prev=$2} {print $1 > out}'
。
$ ls
2-Bathroom.txt 2-Police.txt '2-Sense of Smell.txt' 3-Companies.txt 3-Entrepreneurship.txt file
$ head -n 50 *.txt
==> 2-Bathroom.txt <==
bath room
toilet handle
==> 2-Police.txt <==
crime
innocent
==> 2-Sense of Smell.txt <==
musty smell
odorless
==> 3-Companies.txt <==
móvíl résumés
née dresses
Señor
Zoë’s food store
==> 3-Entrepreneurship.txt <==
good publicity guru
innovation
new income streams
old ideas
,
您非常亲密。
首先,似乎不应将第2列中没有值的单词写入文件。如果是这样,请为您的操作添加测试。测试可以只是$2
,如果{ ... }
为空,则会跳过$2
内部的操作。
第二,如果只需要单词,则仅将col 1写入文件-而不是$0
中的整行
以您的示例(没有,
分隔),您可以执行以下操作:
awk '$2 {print $1 >> ($2 ".txt"); close($2 ".txt")}' file
请确保删除.txt
文件或在空目录中运行,因为如果文件已经存在,这会追加文件。
产生:
2-Bathroom.txt:
toilet
bath
2-Police.txt:
innocent
crime
2-Sense.txt:
odorless
musty
3-Entrepreneurship.txt:
innovation
ideas
income
publicity
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。