【发布时间】:2010-12-16 08:01:50
【问题描述】:
我有一个巨大的制表符分隔文件,格式如下
X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
我想转置它以仅使用 bash 命令的有效方式(我可以编写一个十左右行的 Perl 脚本来执行此操作,但执行起来应该比本机 bash 慢职能)。所以输出应该是这样的
X row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3 2 5 8 11
我想到了这样的解决方案
cols=`head -n 1 input | wc -w`
for (( i=1; i <= $cols; i++))
do cut -f $i input | tr $'\n' $'\t' | sed -e "s/\t$/\n/g" >> output
done
但这很慢,而且似乎不是最有效的解决方案。我在this post 中看到了 vi 的解决方案,但它仍然太慢了。有什么想法/建议/绝妙的想法吗? :-)
【问题讨论】:
-
是什么让您认为存在比 Perl 脚本更快的 bash 脚本?这正是 Perl 擅长的问题。
-
@mark,如果它是纯 bash,它可能比将所有这些 cut/sed 等工具链接在一起更快。但是话又说回来,如果您将“bash”定义为组合工具,那么只需编写一个 awk 脚本就可以与 Perl wrt 文本处理相媲美。
-
添加另一个,因为不了解 perl 在这里有多慢。写代码慢?执行速度慢?我真的不喜欢 perl,但它确实擅长这种任务。
-
如果您的列/字段具有固定的大小/宽度,那么您可以使用 Python 文件搜索来避免将文件读入内存。你有固定的列/字段大小/宽度吗?
-
任何认为 shell 脚本比 awk 或 perl 更快的人都需要阅读unix.stackexchange.com/questions/169716/…,这样他们才能理解为什么不是这样。
标签: bash parsing unix transpose