Bash Shell脚本:转置行和列

3
我需要帮助转置一个仅包含行列数字的文件。由于无法使用awk shell或perl,因此使其变得有些困难。我已经花了几个小时在这上面,但是无法正确地运行它。我尝试了一些其他方法,但现在只有这个。它可以运行,但不会输出任何内容,这让我得出结论,我的代码中可能有问题。如果您不知道什么是转置,它就是将文件:

1 2 3 
4 5 6 

如果这样做,它将打印出

1 4
2 5
3 6

以下是我的代码:

if [ $# -gt 2 ]
then
  echo"System error">&2
exit 1

elif [[ $# -eq 2 && -e "$2" && -r "$2" ]]
then 
while read -a line; do
    for ((i=0; i < "${#line[@]}"; i++)); do
        a[$i]="${a[$i]} ${line[$i]}"
    done
done < $2

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


fi

它对我有效(除了$# -gt 2条件需要在echo和消息之间加一个空格)。你是如何运行它的(以及你传递了什么参数)? - Gordon Davisson
谢谢您的回复。所以当我运行这个脚本时,我会输入:matrix transpose m1...其中matrix是文件名,transpose是函数名,然后m1只是一个包含我需要转置的数字的文本文件。谢谢您的回复。 - user12179064
听起来应该可以。我建议在问题部分之前加上 set -x,这样你就可以看到它运行时发生了什么。 - Gordon Davisson
你指的是哪里需要空间?你是指“echo”系统故障吗?因为那并没有真正做任何事情。 - user12179064
是的,应该是 echo "system failure" -- 尝试带空格和不带空格两种方式,并比较结果。 - Gordon Davisson
显示剩余3条评论
2个回答

2

如果可能,请使用 awk:

源文件(file.txt):

1 2 3
4 5 6

结果:

1 4
2 5
3 6

一行awk脚本:

awk '{ for (i=1; i<=NF; i++) a[i]= (a[i]? a[i] FS $i: $i) } END{ for (i in a) print a[i] }' file.txt

它与其他相同,只不过是在IT技术方面使用。
1 2 3         1 4 7
4 5 6    ->   2 5
7             3 6

并且使用

1 2 3 4       1 5
5 6 7    ->   2 6
              3 7
              4

1

不必编写Bash函数,我们可以使用专门用于重塑矩阵的rs命令。该命令正是您所要求的功能。

rs -T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接