转置制表符分隔文件(如矩阵)

时间:2014-07-08 07:52:31

标签: shell csv

假设我有一个包含制表符分隔值的简单文件:

a b c d e f
aa bb cc dd ee ff
A B C D E F

如何将其转换为矩阵:标签成为换行符,反之亦然:

a aa A
b bb B
c cc C
d dd D
e ee E
f ff F

线条可能相当长。我知道如何通过将所有内容读入2D缓冲区然后将整个内容写出来来在C中完成它,但我正在寻找使用shell脚本的更简单的解决方案,但却没有想到任何明显的解决方案。

2 个答案:

答案 0 :(得分:1)

除非你继续进行多次传递(一行中有元素的传递次数),否则我看不出如何避免使用某种缓冲区。

顺便说一句,你指的是什么样的外壳?

这个其他SO帖子(An efficient way to transpose a file in Bash)似乎恰好解决了bash中的问题。

答案 1 :(得分:0)

是的,你可以用一种非常简单的方式来做到这一点:

#!/bin/bash

ar1=( a b c d e f )
ar2=(aa bb cc dd ee ff )
ar3=(A B C D E F )

for ((i=0; i<${#ar1[@]}; i++)); do

    printf " %s  %s  %s\n" ${ar1[i]} ${ar2[i]} ${ar3[i]}

done

输出:

a  aa  A
b  bb  B
c  cc  C
d  dd  D
e  ee  E
f  ff  F

修改从命令行读取数组也很简单:

ar1=( $1 )
ar2=( $2 )
ar3=( $3 )

for ((i=0; i<${#ar1[@]}; i++)); do

    printf "  %2s  %2s  %2s\n" ${ar1[i]} ${ar2[i]} ${ar3[i]}

done

命令行和输出:

$ ./mtrxpose.sh "a b c d e f" "aa bb cc dd ee ff" "A B C D E F"
a  aa   A
b  bb   B
c  cc   C
d  dd   D
e  ee   E
f  ff   F