shell中字串分割

markzy5201190發表於2013-01-30
shell中字串分割

例子:
[一],將如下字串存放於t.txt檔案下
1:6:0;2:4794537:1;3:19:0;4:28200:0;6:12:1;7:130:1;11:84439:0;
1:1:0;2:108914:0;7:10:0;
1:5:0;2:7104035:1;3:48:1;4:150070:1;6:18:1;7:79:0;
1:1:0;16:10:0;2:380200:0;4:5050:0;6:5:0;10:1:0;11:345715:0;13:2000:0;
........
將如上字元,轉換成如下型別:
[二],將轉換好的字元存放於task_outfile.txt檔案下
1:6:0
6:12:1
7:130:1
11:84439:0
1:1:0
2:108914:0
2:7104035:1
......
最終結果需要得到如下:
[三],
6:12:1
7:130:1
2:7104035:1
......

方法如下:
如上[一到二]轉換:
#!/bin/bash

while read line
        do
                myline=`echo $line | tr -cd ';' | wc -c`   #統計行字串中";"數量
                num=1
                while [ $num -le $myline ] #每行";"數量迴圈次數
                do
                        echo $line | cut -f $num -d ';' >> ./task_outfile.txt #每行";"作,分割點
                        let num=num+1
                done
        done <.>
而後....
[二到三]轉換:
#!/bin/bash

while read line
do
          myline=`echo $line|awk -F ":" '{print $3}'` #":"分隔條件,取第3個域
if [ $myline -eq 1 ]
            then
echo $line >> ./task.txt
fi
done < ./task_outfile.txt
這裡用到while do ... done,從檔案中一行行讀取字串read ...,等.

增加些內容:
問題如下:
a b (2列名稱便於說明)
2757600 2:46601:0;10:46601:0;
轉化成如下格式:
2757600 2:46601:0
2757600 10:46601:0
方法如下:
#!/bin/bash

while read line
        do
                                tmpmyline=`echo $line | awk -F " " '{print $2}'` #取出b列字元
                                myline=`echo $tmpmyline | tr -cd ';' | wc -c` #統計b列中;數量
                num=1
                while [ $num -le $myline ]
                do
                                        tmpline=`echo $line | awk -F " " '{print $1}'` #取出a列資料 
                                        var=$tmpline   
                                        var2=`echo $tmpmyline | cut -f $num -d ';'` #按照b列中;分割
                                        var3=" "
                                        var=${var}${var3}${var2}  #a列+空格+字元
                                        echo ${var} >> ./task_outfile.txt 

                        let num=num+1
                done
        done <.>

2757600 2:46601:0
2757600 10:46601:0
若將其資料貼如excel中,請過濾下行之間的"空格"(這也是遇到問題,未解決...),否則,行資料
放在一個格子中;


參考內容:
1.http://blog.csdn.net/fansongy/article/details/6724228 ---shell程式設計控制結果;
2.http://lyklove123.blog.163.com/blog/static/199371378201282935514507/ --shell從檔案中讀取資料


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26855487/viewspace-753552/,如需轉載,請註明出處,否則將追究法律責任。

相關文章