歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 一次shell中seq的處理

一次shell中seq的處理

日期:2017/3/1 16:32:21   编辑:SHELL編程
一次shell中seq的處理
背景:用要shell 提取 文件中內容,文件名是用序列號如下生成,文件差不多有將近400多w個 如下:
www.2cto.com 原始腳本
#! /bin/sh
#str1=""

#filecount=`ls -l /root/gjj | wc -l | awk '{print $1}'`
#echo $filecount

for n in `seq $1 $2`
do
filename="/windows_gjj/"${n}".txt"
echo $filename

dos2unix $filename
sed -i '1,76d' $filename
sed -i '41,$d' $filename
sed -i 's/<.*">//g' $filename
sed -i 's/<.*>//g' $filename
sed -i 's/^[[:space:]]*//g' $filename
sed -i '/^$/d' $filename
#sed -i 's/;//g' $filename

#cat $filename >> /tmp/all_gjj.log

flag=`grep "&nbsp" $filename | wc -l | awk '{print $1}'`

if [ $flag -ne 10 ]; then
cat $filename >> /tmp/all_gjj.log
echo "********************************************************************************************" >> /tmp/all_gjj.log
LCOUNT=`wc -l $filename | awk '{print $1}'`
str1=""
for i in `seq 1 10`
do
sed -i '1d' $filename
str=`head -n 1 $filename`
echo $str >> /tmp.log
str1=${str1}${str}"|"
echo $str1
sed -i '1d' $filename
done

echo $str1 >> /root/gjj.txt
fi

done

腳本中$1,$2 代表起始的序列號。
一開始的時候,用這個腳本來提取文件內容是正常的,但當文件名上7位數的時候,就出現問題了:

如下:
[root@ALL ~]# sh tiqu.sh 2908637 2908640
/windows_gjj/2.90864e+06.txt
dos2unix: converting file /windows_gjj/2.90864e+06.txt to UNIX format ...
dos2unix: problems converting file /windows_gjj/2.90864e+06.txt
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
grep: /windows_gjj/2.90864e+06.txt: 沒有那個文件或目錄
cat: /windows_gjj/2.90864e+06.txt: 沒有那個文件或目錄
wc: /windows_gjj/2.90864e+06.txt: 沒有那個文件或目錄
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
head: 無法打開 “/windows_gjj/2.90864e+06.txt” 讀取數據: 沒有那個文件或目錄
|
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
head: 無法打開 “/windows_gjj/2.90864e+06.txt” 讀取數據: 沒有那個文件或目錄
||
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
sed:無法讀取 /windows_gjj/2.90864e+06.txt:沒有那個文件或目錄
head: 無法打開 “/windows_gjj/2.90864e+06.txt” 讀取數據: 沒有那個文件或目錄

分析:出現這種問題主要是 shell 把7位數字用指數的形式在表示了,從而造成了找不到對應的文件

解決方法:為了能使 7位數仍然以數字的形式出現,試了 seq 中的-f ,-w 之類的選項都沒達到預期的效果,最後采用了折中的方法,最高位用字符代替,後6為用seq 生成,用參數-w 保持位數的寬度一致,修該的腳本如下:
#! /bin/sh
#str1=""

#filecount=`ls -l /root/gjj | wc -l | awk '{print $1}'`
#echo $filecount

for n in `seq -w $1 $2`
do
n="2"${n}
filename="/windows_gjj/"${n}".txt"
echo $filename

dos2unix $filename
sed -i '1,76d' $filename
sed -i '41,$d' $filename
sed -i 's/<.*">//g' $filename
sed -i 's/<.*>//g' $filename
sed -i 's/^[[:space:]]*//g' $filename
sed -i '/^$/d' $filename
#sed -i 's/;//g' $filename

#cat $filename >> /tmp/all_gjj.log

flag=`grep "&nbsp" $filename | wc -l | awk '{print $1}'`

if [ $flag -ne 10 ]; then
cat $filename >> /tmp/all_gjj.log
echo "********************************************************************************************" >> /tmp/all_gjj.log
LCOUNT=`wc -l $filename | awk '{print $1}'`
str1=""
for i in `seq 1 10`
do
sed -i '1d' $filename
str=`head -n 1 $filename`
echo $str >> /tmp.log
str1=${str1}${str}"|"
echo $str1
sed -i '1d' $filename
done

echo $str1 >> /root/gjj.txt
fi

done

[root@ALL ~]# sh tiqu.sh 908636 908640
/windows_gjj/2908636.txt
dos2unix: converting file /windows_gjj/2908636.txt to UNIX format …
|
/windows_gjj/2908637.txt
dos2unix: converting file /windows_gjj/2908637.txt to UNIX format ...

達到預期的目標了!
Copyright © Linux教程網 All Rights Reserved