在 Ubuntu 上编写一个 bash 脚本,将文本文件中的数字按列读入数组

在 Ubuntu 上编写一个 bash 脚本,将文本文件中的数字按列读入数组

我正在尝试在 ubuntu 12.04 上编写一个小的 bash 脚本,但经验很少。将数字文本文件转换为数组时出现了一个奇怪的小问题。我需要将所有第一个数字、第二个数字等放入它自己的数组中,因为我将基于列而不是行对数字进行计算。所有行都是 5 个整数,用空格分隔,每行末尾都有一个回车符。bash 中可以使用多维数组吗?谢谢!

答案1

这是一个脚本,它将文本文件中的数字存储到两个数组中xy正如你所希望的那样,

#!/bin/bash

nl=$(cat "$1" | wc -l)
declare -a x
declare -a y
for i in $(seq 1 $nl)
do
    x[i]="$(cat "$1" | awk -v p="$i" '{if(NR==p) print $1}')"
    y[i]="$(cat "$1" | awk -v p="$i" '{if(NR==p) print $2}')"
done
#upto this point all the numbers from first and second column of the file are stored 
#into x and y respectively. Following lines will just print them again for you.
for it in $(seq 1 $nl)
do
    echo "${x[$it]} ${y[$it]}"
done

不要忘记授予脚本执行权限。

chmod +x script.sh

用法

./script.sh numfile.txt

我正在考虑将上述脚本保存为,script.sh并且包含数字的文本文件为numfile.txt。并且两者都位于同一目录中。

答案2

Bash 仅支持一维数组,但可以通过一些小技巧模拟多维数组。

本文档包含二维数组的示例。http://tldp.org/LDP/abs/html/arrays.html

我想知道是否有其他语言更适合您的用例。看起来您正在扩展 bash 的功能极限,而 Python、Perl 或 Ruby 可以轻松处理此任务。我猜您在后续“计算”中使用的工具将在很大程度上决定这一点。

答案3

抱歉,我还没有回头检查。解决方案比我想象的要简单,因为数字之间用空格隔开,行末有一个回车符。

#!/bin/bash
COUNT=1
while read arr1[COUNT] arr2[COUNT] arr3[COUNT] arr4[COUNT] arr5[COUNT]
do
echo "next line"
 echo "${arr1[COUNT]}" 
 echo "${arr2[COUNT]}"
 echo "${arr3[COUNT]}"
 echo "${arr4[COUNT]}"
 echo "${arr5[COUNT]}"
COUNT=$[$COUNT +1]
done < /home/john/testloop.txt

相关内容