2013-03-30 126 views
0

我有下面的格式內容的輸入文件:bash腳本 - 字符串比較似乎並不工作

ABCD  XYZAB 1234 
PQRSTUV STU  SKIP 
LMN  OPRQM 8966 
RSTUV OPM  SKIP 
TUV  ZXU  SKIP 

我要分析此文件,並輸出到一個新的文件,例如,與行他們的最後一欄爲「跳過」不會出現在最終的輸出文件,如下圖所示:

ABCD  XYZAB 1234 
LMN  OPRQM 8966 

爲了處理上述情況,我寫了下面的shell腳本:

while read -r col1 col2 col3 
do 
    if [ "$col3" != "SKIP" ] 
    then 
    printf "%s %s %s\n" "$col1" "$col2" "$col3"; 
    fi 
done <input.txt > output.txt 

但是,上面的腳本似乎不工作,我的輸出文件仍然有所有的行,並在他們的最後一列「SKIP」。我不明白爲什麼「條件」失敗?

感謝, VJ

+0

它適用於我。 – Barmar

+0

同樣適用於我;在CentOS和MacOS上運行。 –

+0

這很奇怪,我很確定..我沒有看到這爲我工作:( – TheLoneJoker

回答

1

好,似乎,雖然劇本是正確的,輸入正在編輯的文件在Windows環境。結果行結束符是「\ r」而不是「\ n」。所以,那裏有一個不匹配的地方。所以,條件檢查也失敗了。一旦我將行結束符轉換爲UNIX格式,就可以根據需要獲得輸出結果。感謝大家的幫助。

Vj

+0

你應該標記你的答案爲可接受 – Barmar

+1

這是我的猜測FTR:Windo ws將行結尾編碼爲'\ r \ n',而不僅僅是'\ r'。否則,你的腳本不會找到一個匹配項,因爲整個輸入文件將被作爲一行讀取。由於\ r \ n,最後一個字段被讀作「SKIP \ r」,因此與字符串「SKIP」不匹配。 –

0

VJ - 我沒有看到你的腳本任何問題。我粘貼你的代碼和輸入,結果正是你想要的。請參閱下面的證明我的筆記本電腦「TTT」:

 

[ttt:/m/temp/stack] cat vjvj 

    while read -r col1 col2 col3 
    do 
     if [ "$col3" != "SKIP" ] 
     then 
     printf "%s %s %s\n" "$col1" "$col2" "$col3"; 
     fi 
    done output.txt 

[ttt:/m/temp/stack] cat input.txt 
ABCD  XYZAB 1234 
PQRSTUV STU  SKIP 
LMN  OPRQM 8966 
RSTUV OPM  SKIP 
TUV  ZXU  SKIP 
[ttt:/m/temp/stack] cat output.txt 
ABCD XYZAB 1234 
LMN OPRQM 8966 
[ttt:/m/temp/stack] cat /etc/lsb-release 

    DISTRIB_ID=LinuxMint 
    DISTRIB_RELEASE=13 
    DISTRIB_CODENAME=maya 
    DISTRIB_DESCRIPTION="Linux Mint 13 Maya" 

[ttt:/m/temp/stack] 

+1

這不是一個答案,我們中的一些人已經評論過它按照預期工作 – Barmar

+0

當我發佈時,我不相信有評論如果我錯過了評論,我的歉意 – MoChaMan