我有一个包含以下信息的文本文件:
/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"
任何解决方案? 提前谢谢
答案 0 :(得分:2)
您需要将测试连接到操作
[[ $f2 == 2013 && $f3 == 011 ]] && echo $f1
或
if [ "$f2" = "2013" ] && [ "$f3" = "011" ]; then
echo $f1
fi
您现在正在执行的是执行测试命令并忽略退出状态。所以echo命令确实为每一行执行。
答案 1 :(得分: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"
答案 2 :(得分:1)
总是echo
- $f1
,无论线是否匹配。试试这个:
[[ "${f2}" == "2013" ]] && [[ "${f3}" == "011" ]] && echo "${f1}"
答案 3 :(得分: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
。
答案 4 :(得分: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"