猿问

一种在Bash中转换文件的有效方法

一种在Bash中转换文件的有效方法

我有一个巨大的选项卡分隔文件,格式如下

X column1 column2 column3
row1 0 1 2row2 3 4 5row3 6 7 8row4 9 10 11

我想转座子它以一种高效的方式使用bash命令(我可以编写十行左右的Perl脚本来完成这个任务,但是它的执行速度应该比本机bash函数慢)。所以输出应该看起来像

X row1 row2 row3 row4
column1 0 3 6 9column2 1 4 7 10column3 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" >> outputdone

但这是缓慢的,似乎不是最有效的解决办法。我看到了vi的解决方案这个职位但还是太慢了。有什么想法/建议/绝妙的想法吗?


芜湖不芜
浏览 419回答 3
3回答

有只小跳蛙

另一个选择是使用rs:rs&nbsp;-c'&nbsp;'&nbsp;-C'&nbsp;'&nbsp;-T-c更改输入列分隔符,-C更改输出列分隔符,以及-T移动行和列。不使用-t而不是-T,因为它使用了通常不正确的自动计算的行数和列数。rs它是以APL中的改型功能命名的,带有BSD和OSX,但是它应该可以从其他平台的包管理器获得。第二个选择是使用Ruby:ruby&nbsp;-e'puts&nbsp;readlines.map(&:split).transpose.map{|x|x*"&nbsp;"}'第三种选择是使用jq:jq&nbsp;-R&nbsp;.|jq&nbsp;-sr&nbsp;'map(./"&nbsp;")|transpose|map(join("&nbsp;"))[]'jq -R .将每个输入行打印为JSON字符串文本,-s&nbsp;(--slurp)将每一行解析为JSON后,为输入行创建一个数组,以及-r&nbsp;(--raw-output)输出字符串的内容,而不是JSON字符串文本。这个/运算符重载为拆分字符串。

扬帆大鱼

Python解决方案:python&nbsp;-c&nbsp;"import&nbsp;sys;&nbsp;print('\n'.join('&nbsp;'.join(c)&nbsp;for&nbsp;c&nbsp;in&nbsp;zip(*(l.split()&nbsp;for&nbsp;l&nbsp;in&nbsp;sys.stdin.readlines()&nbsp;if&nbsp;l.strip()))))"&nbsp;<&nbsp;input&nbsp;>&nbsp;output上述情况的依据如下:import&nbsp;sysfor&nbsp;c&nbsp;in&nbsp;zip(*(l.split()&nbsp;for&nbsp;l&nbsp;in&nbsp;sys.stdin.readlines()&nbsp;if&nbsp;l.strip())): &nbsp;&nbsp;&nbsp;&nbsp;print('&nbsp;'.join(c))这段代码确实假设每一行都有相同数量的列(不执行填充)。
随时随地看视频慕课网APP

相关分类

Python
我要回答