目标
linux读取某个文件夹下所有txt文件,同时截取文件名的某一段字符串,添加到csv中的第一列,合成一个csv,增加第一行表头,同时备份txt文件
这是我之前写的一个脚本,下面来分析一下
一、直接上代码含代码说明
#!/bin/bash
path_pwd=$(cd "$(dirname "$0")";pwd)
path=$1
files=$(ls $path/*txt)
for filename in $files
do
name_data=$(basename $filename .txt)
WLTID=${name_data#*_}
#echo $filename
while read line
do
xx=$WLTID','$line
file_csv=${filename%/*}
echo $xx >> "${file_csv}/filename.csv"
done < $filename
done
sed -i '1i\WLTID,MOBILE,IDCARD,uStatus' "${path}/filename.csv"
mv $files "${path_pwd}/data_bak/"
- 首先,第一步我我拿到了该路径的pwd,这里我其实要讲一下的就是,其实我原本不是这么写的,我直接调的pwd函数,在手动执行的时候,可以拿到该目录的路径,但是当我用调度任务的时候,却只有/root 这样的一个路径,所以对这个地方进行了修改,进入到这个目录下再进行pwd
- $1接收一个数据
- /*txt,表示只要以txt结尾的文件
- 循环文件
- name_data=$(basename $filename .txt) 截取文件名字比如/root/dteccc_001.txt —》dteccc_001
- WLTID=${name_data#*_} 这个地方我也是查了一下,意思是以下划线_作为分割只取后面的一部分也就是001,当然也可以取前面的一部分,使用 #—>%
- while一下 逐行读取,方便拼接
- xx=$WLTID’,’$line 这个地方就是进行拼接了,中间以逗号分隔,shell的拼接方法有点类似python
- file_csv=${filename%/*} 这个地方就是取前面的
- echo $xx >> “${file_csv}/filename.csv” 这个地方就是追加了
- done < $filename 传入文件
- sed -i ‘1i’ 这个地方表示在第一行增加
- mv $files “${path_pwd}/data_bak/” 这个地方就是移动到备份的目录下,保持该目录下的文件一直是最新的数据
二、没啥好说的说点其他的
- shell脚本就是多测,不会就测一测,看看具体情况
- 注意空格,注意空格,注意空格,重要的事情说3遍,shell相对于其他的语言来说,语法相对比较严格的。
- 好了,没啥了,撒悠啦啦。