Shell 按行读取文件,并进行字符串切割
设置分隔符,通过 IFS 切割变量
- Shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。
- 而 IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。
txt_comma_division.sh
#/bin/bash
#获取当前目录所在路径
workpath=`pwd`
#清空out_file.txt文件
cat /dev/null > $workpath/out_file.txt
cat /dev/null > $workpath/out_file_tmp.txt
#备份初始分隔符
OLD_IFS="$IFS"
#设置分隔符
IFS=","
#按行读取 in_file.txt 文件
while read line
do
#将读取的一行 按分隔符 分割为数组
array=($line)
#将数组第三位元素写入到临时文件
echo ${array[2]} >> $workpath/out_file_tmp.txt
done < $workpath/in_file.txt
#将临时文件排序,写入到输出文件
sort $workpath/out_file_tmp.txt >> $workpath/out_file.txt
#恢复初始分隔符
IFS="$OLD_IFS"
echo "輸入文件行数"
wc -l $workpath/in_file.txt
echo "輸出文件行数"
wc -l $workpath/out_file.txt
in_file.txt
12345,(12345),23.15.15:551,abcde
12345,(12345),23.15.15:555,abcde
12345,(12345),23.15.15:553,abcde
12345,(12345),23.15.15:554,abcde
12345,(12345),23.15.15:552,abcde
out_file.txt
23.15.15:551
23.15.15:552
23.15.15:553
23.15.15:554
23.15.15:555
out_file_tmp.txt
23.15.15:551
23.15.15:555
23.15.15:553
23.15.15:554
23.15.15:552