情景linux--如何解决read命令产生的硬编码问题
来源:互联网 发布:java线程池原理 编辑:程序博客网 时间:2024/06/09 14:33
情景
我们知道,read命令可以读取文件内容,并把内容赋值给变量。
以如下的数据文件为例。
$ cat data.txt
1 201623210021 wangzhiguo 252 201623210022 yangjiangbo 263 201623210023 yangzhen 244 201623210024 wangdong 235 201623210025 songdong 25
以上文件的四列分别为序号(index)、学号(number)、姓名(name)、年龄(age)。用shell脚本读取该文件并输出每行的值:
$ cat read_data.sh
#!/bin/bashcat data.txt | while read index number name agedo echo "index:${index}" echo "number:${number}" echo "name:${name}" echo "age:${age}" echo " "done
执行脚本,查看结果:
$ sh read_data.sh
index:1number:201623210021name:wangzhiguoage:25index:2number:201623210022name:yangjiangboage:26index:3number:201623210023name:yangzhenage:24index:4number:201623210024name:wangdongage:23index:5number:201623210025name:songdongage:25
不知你发现没有,这样的实现方式有着明显的弊端:
1. 列名(read index number name age)显式地在代码中指定,如果只是想弄清楚数据文件的每列含义,则需要阅读脚本;
2. 该脚本中指明了每列的名称,如果希望修改各字段的英文名称(比如序号的英文名称希望改为NUMBER
)则需要修改脚本,且修改多处;
3. 该脚本按一定顺序读取数据文件,因此,如果数据文件中的列顺序发生了变化,则依然需要修改脚本;
4. 如果有其他数据文件需要按此方式读取,则需要根据数据文件的实际情况再重写一个新脚本;
上述实现方式虽然看起来简单,但基于上述的弊端,我们还应对其进行优化。
方案
解决的根本应该是写尽可能通用的脚本
,不依赖数据文件本身的列数、列顺序、列名称(含义)等。
可以将数据文件的各字段名称存于该数据文件的首行。当读取数据文件时,首先读取数据文件的首行,以获取各字段名称的列表;读取其它行时,将首行的值与非首行的值进行一一对应即可。
数据文件
$ cat new_data.txt
index number name age1 201623210021 wangzhiguo 252 201623210022 yangjiangbo 263 201623210023 yangzhen 244 201623210024 wangdong 235 201623210025 songdong 25
脚本
$ cat new_read_data.sh
#!/bin/bash# 读取文件头行,存于一个数组中tablehead=(`head -n 1 new_data.txt`)# 从文件第二行开始读取,按上述数组顺序读取各字段tail -n +2 new_data.txt | while read ${tablehead[*]}do # 遍历数组的下标,获取tablehead数组的对应值,以及以该值命名的变量的值 for i in `seq 0 $((${#tablehead[@]}-1))` do temp=${tablehead[$i]} echo "${temp}:${!temp}" done echo ""done
结果
$ sh new_read_data.sh
index:1number:201623210021name:wangzhiguoage:25index:2number:201623210022name:yangjiangboage:26index:3number:201623210023name:yangzhenage:24index:4number:201623210024name:wangdongage:23index:5number:201623210025name:songdongage:25
要写出更通用的脚本,还可以做一些判断和处理,比如:数据文件作为参数传入、检查数据文件的行数、检查数据文件的列数,等等。
扩展知识
从脚本的改进上看,比原脚本略显复杂,但却更加通用了。
如果觉得阅读脚本吃力,可以有针对性地学习下,尤其是以下知识点:
- 数组的相关知识:数组长度、数组内容、数组元素等
- 变量${abc}
和${!abc}
的区别
- 情景linux--如何解决read命令产生的硬编码问题
- Win7如何解决内存不能为Read的批处理命令
- 重复提交产生的情景
- 如何解决linux文件系统read-only的状况。
- Linux服务器假死问题的产生及问题的解决
- 如何解决 ios5 编译 ffmpeg产生的问题
- Linux下无法产生core dump的问题与解决
- linux使用yum命令产生的进程锁问题
- 关于linux下ldd命令之后产生的一些问题
- linux使用yum命令产生的进程锁问题
- spring解决硬编码的一种方式@Value
- 【Linux命令】--read命令的用法
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
- hibernate中的sql语句写在xxx.hbm.xml中解决hibernate中原生sql的硬编码问题
- Connection is read-only问题的产生原因与解决方法
- Qt5.8+vs2013集成(64位)
- Android Intend FLAG用法整理
- ocata版本vxlan模式配置【ovs】
- 计算机视觉数据集
- 从陆奇就任三个月所为看百度未来
- 情景linux--如何解决read命令产生的硬编码问题
- 数据结构——栈之顺序存储
- win10配置tensorflow
- 栈在C++中的使用
- Struts上传文件
- 运维学习11
- 在一个千万级的数据库查寻中,如何提高查询效率?
- monkeyDevice常用API
- java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式