一次读取一行文件,然后比较标记的日期(以 bash 为单位)



我是bash和社区的新手,所以请耐心等待。

我正在尝试创建一个简单的脚本:

  1. 逐行读取 txt 文件
  2. 从每行中获取特定于 Grep 的字符串(在本例中为日期),并将其分配给变量
  3. 将其与之前定义的另一个日期进行比较。
  4. 如果日期更大/更小,则打印整行。

这就是我试图实现它的方式:

compareDate="$(date -d '2005-01-01' '+%Y-%m-%d')"
while read -r line;
do
date="$(grep -oP 'foo K.*')"
if [[ $date < $compareDate ]];
echo $line 
then
continue
fi
done < text.txt

文本.txt包含:

foo 2000-01-01
foo 2002-01-01
foo 2004-01-01
foo 2005-01-01
foo 2006-01-01
foo 2007-01-01
foo 2008-01-01

执行时的结果是:

./line.sh 
foo 2000-01-01

我认为确切的问题是"date"grep定义了整个文本,而不是一次一行:

mg@mg:~/bash -x line.sh 
++ date -d 2005-01-01 +%Y-%m-%d
+ compareDate=2005-01-01
+ read -r line
++ grep -oP 'foo K.*'
+ date='2002-01-01
2004-01-01
2005-01-01
2006-01-01
2007-01-01
2008-01-01'
+ [[ 2002-01-01
2004-01-01
2005-01-01
2006-01-01
2007-01-01
2008-01-01 < 2005-01-01 ]]
+ echo foo 2000-01-01
foo 2000-01-01
+ continue
+ read -r line
m@mg:~$ 

另外,一旦"日期"在循环中被正确定义并正确定义,我想在比较之前也应该将其转换为日期格式?

我也尝试使用 awk 而不是 grep,但最终结果是一样的。

我可能已经查看了有关此的所有类似线程,但我不确定我错过了什么。

PS:我意识到代码很可能充满了不正确的语法和格式,所以很抱歉:)

任何帮助都非常感谢。

你快到了。正如您所发现的,grep会啜饮所有标准输入 尽管read试图逐行处理它。 相反,您可以显式馈送变量$linegrephere string表示法<<< "$line".请尝试以下操作:

compareDate="$(date -d '2005-01-01' '+%Y-%m-%d')"
while read -r line; do
date="$(grep -oP 'foo K.*' <<< "$line")"
if [[ $date < $compareDate ]]; then
echo "$line"
fi
done < text.txt

结果:

foo 2000-01-01
foo 2002-01-01
foo 2004-01-01

此外,请将线路echo "$line"放在thenfi之间。 否则,无论if条件如何,都将调用它。
希望这有帮助。

相关内容

  • 没有找到相关文章