0

我正在编写一个 bash 脚本,该脚本根据条目上的预设时间间隔对文本文件中的列表进行排序,在这种情况下,我有一个名为 的文本文件final.txt,其中包含以下几行:

14-Oct-2013|04:18|
14-Oct-2013|04:16|
14-Oct-2013|04:20|
14-Oct-2013|05:16|
14-Oct-2013|06:16|

我将按时间顺序在 04:16 到 05:16 的文本文件中显示条目。所以它会显示如下:

14-Oct-2013|04:18|
14-Oct-2013|04:16|
14-Oct-2013|04:20|
14-Oct-2013|05:16|

并且结果不应显示最后一行,因为最后一行超出了设置的时间间隔(04:16 到 05:16)

我尝试 grep 作为开始时间间隔,但我不知道如何对开始和结束时间间隔内的条目进行排序。我想再次将它通过管道传递给 grep 以对结束间隔时间进行排序,但是,我知道,这不会显示任何内容

无论如何,这是我的代码:

cat final.txt | grep $DATE_TO_SORT | sort | grep $HOUR_TO_SORT | sort

这里有人有解决方案吗?将不胜感激

4

3 回答 3

0

由于perl可以在任何 unix 风格中使用,并且您可以从命令行使用它,我会以这种方式使用它:

$ perl -n -e 'print "$_" if (/(.+)\|(.+)\|/ && $1 eq "14-Oct-2013" && $2 >= "04:18" && $2 <= "05:16")' | sort
14-Oct-2013|04:16|
14-Oct-2013|04:18|
14-Oct-2013|04:20|
14-Oct-2013|05:16|

这可能是最简单的:

$ perl -n -e 'print $_ if ($_ ge "14-Oct-2013|04:16" && $_ lt "14-Oct-2013|05:17")' | sort
14-Oct-2013|04:16|
14-Oct-2013|04:18|
14-Oct-2013|04:20|
14-Oct-2013|05:16|

要阅读 sh vars,您只需正确使用引号和 $,以便 shell 可以扩展变量,这里有两种使用单引号或双引号来包含 perl 参数的情况:

$ FROM="14-Oct-2013|04:16"
$ TO="14-Oct-2013|05:17"
$ perl -n -e 'print $_ if ($_ ge "'$FROM'" && $_ lt "'$TO'")' | sort
or
$ perl -n -e "print \$_ if (\$_ ge '$FROM' && \$_ lt '$TO')" | sort
于 2013-10-16T07:10:29.907 回答
-1

使用 sort 的 -k 选项按列排序。我曾经tr将您的数据转换为列数据。

user@m:/tmp$ cat final.txt | tr "|" "\t" | sort -k 2
14-Oct-2013 04:16   
14-Oct-2013 04:18   
14-Oct-2013 04:20   
14-Oct-2013 05:16   
14-Oct-2013 06:16   
于 2013-10-16T06:48:52.907 回答
-1

这将满足您的要求,并且对任何日期/时间范围都很有用

#!/bin/bash

fn=test.txt
sn=${fn}.sorted

# date to search for
dn=14-Oct-2013
# start time
st=04:16
# end time
et=05:16

# get the output in date/time order
sort -V $fn >$sn
# find the first line number that is of interest (date / time)
startline=`grep $dn $sn |grep -n $st|head -n 1|cut -d: -f1`
# adjust to make results inclusive, comment this to make exclusive
startline=$(( startline - 1 ))
# find the last line number of interest
endline=`grep $dn $sn |grep -n $et |tail -n 1|cut -d: -f1`
# get the total number of lines
numlines=`wc -l $sn|cut -d" " -f 1`
# compute the number of lines to display
displines=$(( endline - startline ))
# compute the window size to search within
windowstart=$(( numlines - startline ))
# display the relevent lines from $startline to $endline
tail -n $windowstart $sn |head -n $displines
于 2013-10-16T10:06:18.287 回答