2014-03-06 186 views
2

我有一個文本文件包含以下信息:while循環bash腳本

/media/Arc/eo_archive_test/MODIS/L2_LAC_OC/A2006001071000.L2_LAC_OC.x.hdf:2006:365 
/media/Arc/eo_archive_test/MODIS/L2_LAC_OC/A2006001084000.L2_LAC_OC.x.hdf:2013:011 
/media/Arc/eo_archive_test/MODIS/L2_LAC_OC/A2006001084500.L2_LAC_OC.x.hdf:2005:365 
.... 

我想呼應$ F1其中$ f2爲 「2013」​​ 和$ f3是 「011」。我正在使用以下腳本,但它的所有迴應。我在這裏做錯了什麼?

file=/media/Arc/eo_archive_test/MODIS/input/all_file_list.txt 
while IFS=: read -r f1 f2 f3 
do 
    [ "$f2" = "2013" ] || [ "$f3" = "011" ] 
    echo $f1 
done < "$file" 

任何解決方案? 預先感謝您

回答

1

你必須包括if句子內部的比較和使用&&代替||,如:

file=/media/Arc/eo_archive_test/MODIS/input/all_file_list.txt 
while IFS=: read -r f1 f2 f3 
do 
    if [ "$f2" = "2013" ] && [ "$f3" = "011" ]; then 
     echo $f1 
    fi 
done < "$file" 
+0

非常感謝你。這個解決方案的作品;我對此非常高興。我很貪心;)。現在我有點雄心勃勃..如果我想添加...「$ f3 = 001到007」。那將是什麼正確的語法?提前感謝您...... – neel

+1

@neel:使用'-gt'和'-lt'來比較數字,比如:'[「$ f3」-gt「000」] && [「$ f3」-lt「008 「]' – Birei

+1

或者類似'[[」$ {f3}「=〜00 [0-7]]]'... – twalberg

2

您需要測試連接到行動

[[ $f2 == 2013 && $f3 == 011 ]] && echo $f1 

if [ "$f2" = "2013" ] && [ "$f3" = "011" ]; then 
    echo $f1 
fi 

你現在正在做的是執行測試命令並忽略退出狀態。所以echo命令確實對每一行執行。

1

你是echo -ing $f1總是,無論線是否匹配。試試這個:

[[ "${f2}" == "2013" ]] && [[ "${f3}" == "011" ]] && echo "${f1}" 
0

這適合awk的加工模型。

awk -F : '$2 == "2013" && $3 == "011" { print $1 }' /media/Arc/eo_archive_test/MODIS/input/all_file_list.txt 

如果你想有一個正則表達式來代替,這樣做了像$3 ~ /^00[1-7]$/或者你可以做一個數字比較$3 > 0 && $3 <= 7

0

......如上所述,我能夠自動化我的一部分需求;需要多一點幫助,這裏是代碼....

file=/media/Arc/eo_archive_test/MODIS/input/all_file_list.txt 
while IFS=: read -r f1 f2 f3 
do 
for year in "2006" "2007" "2008" "2009" "2010" "2011" "2012" "2013" 
do 
[[ $f2 == $year ]] 
for doy in "001" "002" "003" "004" "005" "006" "007" # here we need some automation; seeking help 
do 
[[ $f3 == $doy ]] && echo $f1 >> test.txt 
done 
done 
done < "$file"