我从文本文件导入纬度和经度。这两个文本文件包含数千个数字。我将它们读入变量,现在我想知道这些文件中有多少个数字。我用了这个问题:验证变量的长度但由于某种原因,我得到的输出是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[@]}"