遍历文件并格式化输出文件(shell脚本实现)

【背景】

1.项目开发中,急需要根据资源路径res下的文件,生成如下三种格式的文件。

格式一:

#define IDR_CEF_0001    101
#define IDR_CEF_0002    102
...
#define     IDR_CEF_0122    222

格式二:

{“about.html”, IDR_CEF_0001},

{“addProbe.html”, IDR_CEF_0002},

{“img/helpimg/help17.PNG”, IDR_CEF_0122},

格式三:

IDR_CEF_0001 HTML “res\about.html”

IDR_CEF_0002 HTML “res\addProbe.html”

IDR_CEF_0122 HTML “res\img\helpimg\help17.PNG”

【着急情况半手工实现如下】

1.C++实现获取文件名称,输出到txt文档中,拷贝到Excel以便按列处理。

2.构造格式一左数据,组合成格式一数据。

3.结合notepad++正则表达式匹配,构造格式二、三内容,组合成格式二、三数据。

缺点非常明显:

1.手动,很容易路径弄错,文件少弄,后期Bug不可评估。

2.耗时也接近3个小时。

3.如果又有新的文件如(Inner,outer,other)三份资源文件,需要操作3次。

总之,很傻,很笨。

【Shell脚本实现】

源码如下:

#! /bin/bash

function read_dir()
{
for file in `ls $1`
do
if [ -d $1"/"$file ]; then
read_dir $1"/"$file
else
echo $1"/"$file
fi
done
}

#output files
touch out_files.txt
read_dir "/home/laoyang/test/res" > out_files.txt

#recurse files
#1.delete the front path /home/laoyang
cat out_files.txt | sed ‘s/\/home\/laoyang\///g‘ > out22_files.txt

#get line nums
linenums=`cat out22_files.txt | wc -l`
echo $linenums

#construct format_files.txt
#1.#define IDR_CEF_0001 101
rm -rf format_file1.txt
for((i=1;i<=$linenums;i++))
do
echo "#define   IDR_CEF_"${i}	$[ 100 + ${i} ] >> format_file1.txt
done

#2. {"about.html",  IDR_CEF_0001},
cat out22_files.txt | sed ‘s/test\/res\///g‘ > out33_files.txt
awk ‘{print $2}‘ format_file1.txt > format_file2_1.txt #IDR_CEF_0001 format
sed ‘s/$/},/g‘ format_file2_1.txt > format_file2_2.txt
sed ‘s/^/{"/g‘ out33_files.txt > out4_file.txt
sed ‘s/$/",/g‘ out4_file.txt > out5_file.txt

paste -d "  " out5_file.txt format_file2_2.txt > format_file2.txt

#3.IDR_CEF_0001 HTML    "res\\about.html"
rm -rf format_file3_2.txt
for((i=1;i<=$linenums;i++))
do
echo "HTML" >> format_file3_2.txt
done

cat out22_files.txt | sed ‘s/test\///g‘ > out44_files.txt
cat out44_files.txt | sed ‘s#\/#\\\\#g‘ > out55_files.txt   

cat out55_files.txt | sed ‘s#^#"#g‘ > out66_files.txt
cat out66_files.txt | sed ‘s#$#"#g‘ > out77_files.txt

paste -d "  " format_file2_1.txt format_file3_2.txt > format_file3_tmp.txt
paste -d "  " format_file3_tmp.txt out77_files.txt > format_file3.txt

mkdir format_rst
mv format_file1.txt format_file2.txt format_file3.txt ./format_rst/

优点:

1.快,不会丢失,有多少文件就是多少文件。

2.可以复用,新增文件或者其他模块也有类似文件,直接跑一遍脚本即可。

Shell脚本在文本逐行读取、按列匹配、正则匹配有先天的优势。所以Shell实现是很好的选择。

如果用C++实现代码行数会几百甚至上千,且匹配会非常复杂。

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/49834859

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-04 19:59:49

遍历文件并格式化输出文件(shell脚本实现)的相关文章

HttpRequest获取文件流,HttpResponse输出文件流

HttpResponse输出文件: Response.Clear(); Response.ContentType = "application/octet-stream"; //通知浏览器下载文件而不是打开 Response.AddHeader("Content-Disposition", "attachment; filename=aaa.csv"); var sw = new StreamWriter(response.OutputStrea

nodejs写入json文件,格式化输出json的方法

假如我需要把data序列化成json字符串,然后写入data.json文件中,代码如下: 1 let str = JSON.stringify(data) 2 3 fs.writeFile('data.json',str,function(err){ 4 if (err) {res.status(500).send('Server is error...')} 5 }) 入json文件后,都会出现很恶心的一行式,看看 不能忍对不对!!! Vanilla JS的JSON.stringify()是可

copy命令及库文件至/mnt/sysroot/目录shell脚本

#!/bin/bash # #获取目标目录 target=/mnt/sysroot #命令copy函数 cmndcopy(){         #假如命令不存在,return 1         if ! which $1 &> /dev/null; then                 return 1         fi         #获取命令决定路径         cmnd=$(which --skip-alias $1)         #获取命令目录名         

文件操作:输出文件二进制数据

#include <stdio.h> int main(int argc, char *argv[]) { int i; FILE *fp = NULL; unsigned char *pData; int iLen, itmpLen, itmp; fp = fopen(argv[1], "rb"); if(fp == NULL) { printf("fopen err\n"); goto end; } fseek(fp, 0, SEEK_END); i

使用shell+awk完成Hive查询结果格式化输出

好久不写,一方面是工作原因,有些东西没发直接发,另外的也是习惯给丢了,内因所致.今天是个好日子,走起! btw,实际上这种格式化输出应该不只限于某一种需求,差不多是通用的. 需求: --基本的:当前Hive查询结果存在数据与表头无法对其的情况,不便于监控人员直接查看,或者导出到excel中,需要提供一个脚本,将查询结果处理下,便于后续的查看或者操作. --额外的:A.每次查询出来的结果字段数.字段长度不固定:B.每个数据文件中可能包含不只一套查询结果,即存在多个schema. 想法: 对于基本需

Shell脚本实现磁盘分区格式化

Shell脚本实现磁盘分区格式化 我们的Shell脚本程序结构分为,顺序结构,选择结构以及循环结构,我们之前已经介绍过选择结构包括if.case语句,循环结构包括for循环.while循环以及until循环,今天我们就来介绍一下until循环,until循环的语法格式如下: until condition;do 循环体 done 由以上可以看出,我们的until循环的语法格式和我们的while循环是一样的,唯一不同的是我们的while循环是在满足condition的情况下进入循环体进行循环,而我

Beyond Compare和输出文件比较的方法

作为文件对比工具Beyond Compare 4 软件可以对文件进行比较和合并,用Beyond Compare软件进行文本合时,是可以将两个不同版本的同个文件的进行变更合并,生成一个输出文件.有些用户可能会遇到让生成的输出文件再次和原文件进行比对,这个时候可以利用合并会话操作界面直接跳转进行文本比较操作,下面我们就针对这个问题来给大家介绍介绍Beyond Compare和输出文件比较的方法? 原文:http://www.beyondcompare.cc/jiqiao/shuchu-wenjian

Shell脚本基础介绍

shell基础简介: 编写脚本通常使用某种基于解释器的编程语言.而shell脚本不过就是一些文件,我们能将一系列需要执行的命令写入其中,然后通过shell来执行这些脚本. 进入Linux系统(Ubuntu),打开终端Terminal,"$"表示普通用户,"#"表示超级用户.其实此时打开的即为shell终端.注意:Redhat/CentOS系统默认安装的shell是bash,它是sh的增强版,Ubuntu默认安装的shell是dash.通过执行:$ ll  /bin/

shell脚本编程-循环(for、while、until)

for命令格式:– list参数:迭代中要用的一系列值– 每个迭代中,变量var会包含列表中的当前值– do和done语句之间输入的命令可以是一条或多条标准的bash shell命令 1 2 3 4 for var in list do commands done 读取列表中的值 for命令最基本的用法就是遍历for命令自身中定义的一系列值: 在最后一次迭代后,$test变量的值会在shell脚本的剩余部分一直保持有效,除非修改它 1 2 3 4 5 6 7 8 9 10 11 12 13 14