一种在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
ruby -e'puts readlines.map(&:split).transpose.map{|x|x*" "}'
jq
:
jq -R .|jq -sr 'map(./" ")|transpose|map(join(" "))[]'
jq -R .
-s
(--slurp
-r
(--raw-output
/
扬帆大鱼
TA贡献1799条经验 获得超9个赞
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))
添加回答
举报
0/150
提交
取消