日期:2014-05-16  浏览次数:20511 次

[求助]列表中某一列的值获取
这个是我的LINUX作业,嗯,第一题就卡住了

要求是做一个脚本文件,比如:$scirpt1.sh [-o] a.jpg b.jpg c.jpg ...
结果是要显示一个列表,格式是“文件名 创建时间”,其中创建时间如上图是通过exif2软件包截取TAG获得的
参数-o加上的话,就是将列表按时间顺序排序。

问题比较多
1.就是参数-o的写法,是不是检测$1然后shift?因为就这一个参数设置所以可以的话不用getopt

2.关于上图的那个列表,很不幸的是,没法用cut简单分类,因为分隔符并不是TAB,而是空格,更糟的是,文件名中有空格的话,根本就起不到作用。有人说可以用awk但是那个不会用。还有一点,第二题是跟第一题有关的,要求是把文件名给改成文件.时间.后缀这么一个格式,即例如:a.jpg就改成a.yyyy-mm-jj_hh.mm.ss.jpg这么一个样式,所以尽可能的话,果然还是希望把文件名和创建时间作为数值取出来。但是方法一时想不到。

3.最后就是脚本写出来后是$2$3$4这样一个一个轮流处理还是有一次性解决的方法?目前我构思的框架就是只能一个一个处理,但是这样要排序的话是不是只能先生成一个临时文本,再对文本内容进行排序?有没有其他思路?

请高手指点,谢谢。

------解决方案--------------------
如果输出的文件名固定为“JPG”作为后缀的话 文件名 的获取可以考虑用“JPG”作为分隔符;
时间的获取 考虑用空格分隔,取最后2个字段;
至于“-o”自己在脚本前面加判断然后配合排序就行了。

awk命令如下:
awk -F ".JPG" '{num=split($0,A," "); gsub(":",".",A[num-1]);gsub(":",".",A[num]);print $1"."A[num-1]"_"A[num]".jpg"}'   

#由于没有lz的环境,自己造了一个测试文件,里面的内容跟lz的输出类似
cat test.txt  
a1.JPG exif  Ascii 20 2012:10:28 09:26:32
a2.JPG exif Ascii 20 2012:11:20 03:26:32
a3 xy.JPG  exif Ascii 20 2012:10:28 10:26:32
a4.JPG exif Ascii 20 2012:10:23 09:26:32
a5 aa.JPG exif Ascii 20 2012:10:28 09:26:35

#替换后的文件名
awk -F ".JPG" '{num=split($0,A," "); gsub(":",".",A[num-1]);gsub(":",".",A[num]); print $1"."A[num-1]"_"A[num]".jpg"}' test.txt
a1.2012.10.28_09.26.32.jpg
a2.2012.11.20_03.26.32.jpg
a3 xy.2012.10.28_10.26.32.jpg
a4.2012.10.23_09.26.32.jpg
a5 aa.2012.10.28_09.26.35.jpg