为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

芜湖不芜 2019-06-25 17:21:58
一种在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的解决方案这个职位但还是太慢了。有什么想法/建议/绝妙的想法吗?
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

另一个选择是使用rs:

rs -c' ' -C' ' -T

-c更改输入列分隔符,-C更改输出列分隔符,以及-T移动行和列。不使用-t而不是-T,因为它使用了通常不正确的自动计算的行数和列数。rs它是以APL中的改型功能命名的,带有BSD和OSX,但是它应该可以从其他平台的包管理器获得。

第二个选择是使用Ruby:

ruby -e'puts readlines.map(&:split).transpose.map{|x|x*" "}'

第三种选择是使用jq:

jq -R .|jq -sr 'map(./" ")|transpose|map(join(" "))[]'

jq -R .将每个输入行打印为JSON字符串文本,-s (--slurp)将每一行解析为JSON后,为输入行创建一个数组,以及-r (--raw-output)输出字符串的内容,而不是JSON字符串文本。这个/运算符重载为拆分字符串。


查看完整回答
反对 回复 2019-06-25
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

Python解决方案:

python -c "import sys; print('\n'.join(' '.join(c) for c in zip(*(l.split() for l in sys.stdin.readlines() if l.strip()))))" < input > output

上述情况的依据如下:

import sysfor c in zip(*(l.split() for l in sys.stdin.readlines() if l.strip())):
    print(' '.join(c))

这段代码确实假设每一行都有相同数量的列(不执行填充)。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 418 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信