2011-05-10 57 views
1

我有一個文件,它有很長的數據行。當我嘗試使用shell腳本讀取時,數據會進入多行,即在某些點中斷。閱讀很長的一行,而沒有在shell腳本中分成多行

例行:

B_18453583||Active|917396140129|405819121107402|Active|7396140129||7396140129|||||||||18-MAY-10|||||18-MAY-10|405819121107402|Outgoing International Calls,Outgoing Calls,WAP,Call Waiting,MMS,Data Service,National Roaming-Voice,Outgoing International Calls except home country,Conference Call,STD,Call Forwarding-Barr,CLIP,Incoming Calls,INTSNS,WAPSNS,International Roaming-Voice,ISD,Incoming Calls When Roaming Internationally,INTERNET||For You Plan|||||||||||||||||| 

所有這是一個單行的內容。 我使用的是正常的讀這樣的:

var=`cat pranay.psv` 
for i in $var; do 
    echo $i 
done 

輸出當屬:

B_18453583||Active|917396140129|405819121107402|Active|7396140129||7396140129|||||||||18- MAY-10|||||18-MAY-10|405819121107402|Outgoing 
International 
Calls,Outgoing 
Calls,WAP,Call 
Waiting,MMS,Data 
Service,National 
Roaming-Voice,Outgoing 
International 
Calls 
except 
home 
country,Conference 
Call,STD,Call 
Forwarding-Barr,CLIP,Incoming 
Calls,INTSNS,WAPSNS,International 
Roaming-Voice,ISD,Incoming 
Calls 
When 
Roaming 
Internationally,INTERNET||For 
You 
Plan|||||||||||||||||| 

如何打印所有單行? 請幫忙。
謝謝

回答

4

這是因爲word splitting。一個簡單的方法來做到這一點(這也與useless use of cat解散)是這樣的:

while IFS= read -r -d $'\n' -u 9 
do 
    echo "$REPLY" 
done 9< pranay.psv 

詳細講解:

  • $「...」可用於創建人類可讀的字符串轉義序列。見man bash
  • IFS=有必要避免IFS中的任何字符從$ REPLY的開頭和結尾中刪除。
  • -r避免在文本中專門解釋反斜槓。
  • -d $'\n'按換行符分行。
  • 使用文件描述符9進行數據存儲而不是標準輸入,以避免貪吃像cat這樣的命令。
1

您需要正確的引用。在你的情況下,你應該使用命令read

while read line ; do 
    echo "$line" 
done < pranay.psv 
相關問題