2017-07-28 46 views
1

簡短版本:如何在bash中創建一個讀取文件的循環log.dat由成對的行組成,比較第二個與「0.0」,並且在它們匹配的情況下輸出另一個,否則輸出第二個。比較單個文件中的相鄰行與bash

長版本:我有一個文本文件與對象的位置。職位由兩種不同的方法決定,一種更精確,更準確,但有時會失敗,另一種更穩健但不太準確。問題是,我想盡量減少整個數據中的錯誤,並將腳本保存在bash中。

數據例如:
timestep1 ALG2 15.326785087600001
timestep1 ALG1 15.19699239146999
timestep2 ALG2 0.0
timestep2 ALG1 15.244353796926141

+0

你可以使用'while IFS =''read -r ln || [[-n $ ln]];做; done <「INPUT_FILE」'在Bash中逐行循環遍歷一個文件。 –

+1

@AlexejMagura隨時回答這個問題。 – baranskistad

回答

0

您可以通過遍歷文件用while-loopread做到這一點:

while IFS='' read -r ONE || [[ -n $ONE ]]; do 
    read -r TWO 
    if [[ $TWO == "0.0" ]]; then # string comparison, not numeric. 
    { read -r THREE || [[ -n $THREE ]]; } && echo $THREE; 
    fi 
done < "log.dat" 

細分:

  • IFS=''(或IFS=)保護者前緣/後空白中的每一行經由read讀取。 (猛砸通常把空格作爲單詞定界符:這可防止行爲)

  • -r防止反斜槓被解釋

  • || [[ -n $ONE ]]防止輸入文件的最後一行從如果它不包含被忽略逃逸一行結尾字符,如\n\c\r :(讀取時遇到EOF返回非零退出代碼)。

+1

謝謝,這正是我所需要的,儘管完整版本看起來像這樣:'#!/ bin/bash 而IFS =''read -r ONE || [[-n $ ONE]];執行 read -r TWO; if [[$ TWO ==「0.0」]];然後#字符串比較,而不是數字。 {讀-r THREE || [[-n $ THREE]]; } && echo $ THREE; else echo $ TWO; fi done <「log_total.0.0-0.5.dat」' –

+0

@AndreiBazarenko不用客氣;如果我的回答很有幫助,那麼請隨時註冊並選擇它作爲接受的答案。 –

+1

是的,當然。不幸的是,目前我沒有足夠的聲望。 –

相關問題