变量的长度

变量的长度

我从文本文件导入纬度和经度。这两个文本文件包含数千个数字。我将它们读入变量,现在我想知道这些文件中有多少个数字。我用了这个问题:验证变量的长度但由于某种原因,我得到的输出是length of Lat is 1.

#!/bin/sh

mapfile Latitude < final_ADCP_Saved.matLatitude.txt
mapfile Longitude < final_ADCP_Saved.matLongitude.txt


echo "length of Lat is ${#Latitude[@]}"
echo "length of Lon is ${#Longitude[@]}"

如果我说echo "$Longitude输出是

3.4269394e+00   3.4240913e+00   3.4212670e+00   3.4184430e+00   3.4156012e+00   3.4126834e+00   3.4097271e+00   3.4069235e+00   3.4041572e+00   3.4010903e+00   3.3982218e+00   3.3953517e+00   3.3925018e+00   3.3897342e+00   3.3868243e+00   3.3839234e+00   3.3810560e+00

如何确定这些变量的长度?

答案1

值之间没有换行符。因此,您需要通过以下方式指定分隔符-d

mapfile -d ' ' Latitude < final_ADCP_Saved.matLatitude.txt
mapfile -d ' ' Longitude < final_ADCP_Saved.matLongitude.txt

现在应该正确地将每个纬度/经度放入其自己的数组元素中。

编辑:这个-d选项似乎是一种现代的攻击。解决此问题的另一种方法似乎是tr将空格转换为换行符(并用于-s挤出重复项):

tr -s ' ' '\n' < final_ADCP_Saved.matLatitude.txt | mapfile Latitude

不幸的是,这不起作用,因为管道导致mapfile在子 shell 中运行,因此该变量在主 shell 中不可用。

解决方法是首先将 shell 的标准输入更改为进程替换,然后运行mapfile

#!/bin/bash

exec < <(tr -s ' ' '\n' < final_ADCP_Saved.matLatitude.txt)
mapfile Latitude
exec < <(tr -s ' ' '\n' < final_ADCP_Saved.matLongitude.txt)
mapfile Longitude

echo "length of Lat is ${#Latitude[@]}"
echo "length of Lon is ${#Longitude[@]}"

请注意,我将第一行更改为,#!/bin/bash因为这仅在 bash 中有效。

编辑2

现在我想了一下,这exec部分不需要单独做:

#!/bin/bash

mapfile Latitude < <(tr -s ' ' '\n' < final_ADCP_Saved.matLatitude.txt)
mapfile Longitude < <(tr -s ' ' '\n' < final_ADCP_Saved.matLongitude.txt)

echo "length of Lat is ${#Latitude[@]}"
echo "length of Lon is ${#Longitude[@]}"

相关内容