【发布时间】:2020-02-06 15:25:40
【问题描述】:
我有一个大的 .csv 文件,我必须删除其中的空列。空,我的意思是他们有一个标题,但列的其余部分不包含数据。
我编写了一个 Bash 脚本来尝试执行此操作,但遇到了一些问题。 代码如下:
#!/bin/bash
total="$(head -n 1 Reddit-cleaner.csv | grep -o ',' | wc -l)"
i=1
count=0
while [ $i -le $total ]; do
cat Reddit-cleaner.csv | cut -d "," -f$i | while read CMD; do if [ -n CMD ]; then count=$count+1; fi; done
if [ $count -eq 1 ]; then
cut -d "," -f$i --complement <Reddit-cleaner.csv >Reddit-cleanerer.csv
fi
count=0
i=$i+1
done
首先我找到列数,并将其存储起来。然后,当程序没有到达最后一列时,我逐列循环。嵌套的 while 循环检查列中的每一行是否为空,如果有多行不为空,则将所有其他列写入另一个文件。
我知道这个脚本存在一些问题。首先,count 修改发生在子 shell 中,因此 count 永远不会在父 shell 中修改。其次,每次脚本找到空列时,我正在写入的文件都会被覆盖。
所以我的问题是我该如何解决这个问题。我最初想要它,以便它根据计数逐列写入新文件,但也不知道如何完成。
编辑:人们要求提供示例输入和输出。
Sample input:
User, Date, Email, Administrator, Posts, Comments
a, 20201719, a@a.com, Yes, , 3
b, 20182817, b@b.com, No, , 4
c, 20191618, , No, , 4
d, 20190126, , No, , 2
Sample output:
User, Data, Email, Administrator, Comments
a, 20201719, a@a.com, Yes, 3
b, 20182817, b@b.com, No, 4
c, 20191618, , No, 4
d, 20190126, , No, 2
在示例输出中,除了标题(帖子)之外没有数据的列已被删除,而完全或部分填充的列仍然存在。
【问题讨论】:
-
您能否将示例输入数据与预期输出相加。
-
你可以使用 bash 调用 python 脚本并用 3 行来解决这个问题(加载 pandas csv / remove emptys / save csv)。您是否坚持使用 bash 解决方案,可能是因为您不能保证 python / pandas 可用?
-
另外,请考虑@anubhava 的请求。如果您不给我们一种方法来验证我们对输入和输出应该是什么样子的想法,我们将无法帮助您
-
顺便说一句,您应该通过shellcheck.net 运行您的脚本并阅读why-is-using-a-shell-loop-to-process-text-considered-bad-practice。发明 shell 以创建/销毁文件和进程以及对工具的顺序调用的人还发明了 awk 作为 shell 调用以操作文本的工具。