Bash:按时间戳对文件中的行进行排序

时间:2018-04-14 18:21:19

标签: bash

我是bash脚本的新手,我编写了一个脚本来匹配正则表达式和输出行以打印到文件。

但是,每行包含多个列,其中一列是时间戳列,它以YYYYMMDDHHMMSSTTT(毫秒)的形式出现,如下所示。

20180301050630663,ABC,,,,,,,,,,
20180301050630664,ABC,,,,,,,,,,
20180301050630665,ABC,,,,,,,,,,
20180301050630666,ABC,,,,,,,,,,
20180301050630667,ABC,,,,,,,,,,
20180301050630668,ABC,,,,,,,,,,
20180301050630663,ABC,,,,,,,,,,
20180301050630665,ABC,,,,,,,,,,
20180301050630661,ABC,,,,,,,,,,
20180301050630662,ABC,,,,,,,,,,

我的代码编写如下:

awk -F "," -v OFS=","'{if($2=="ABC"){print}}' < $i>> "$filename"

如何修改我的代码,以便在打印到文件之前按行时间戳(YYYYMMDDHHMMSSTTT)按升序对行进行排序?

3 个答案:

答案 0 :(得分:4)

您可以使用非常简单的排序命令,例如

sort yourfile

如果你想确保sort只查看日期戳,你可以告诉sort只使用第一个命令分隔字段作为你的排序标准,例如

sort -t, -k1 yourfile

示例使用/输出

将数据保存在名为log的文件中,您可以执行以下操作:

$ sort -t, -k1 log
20180301050630661,ABC,,,,,,,,,,
20180301050630662,ABC,,,,,,,,,,
20180301050630663,ABC,,,,,,,,,,
20180301050630663,ABC,,,,,,,,,,
20180301050630664,ABC,,,,,,,,,,
20180301050630665,ABC,,,,,,,,,,
20180301050630665,ABC,,,,,,,,,,
20180301050630666,ABC,,,,,,,,,,
20180301050630667,ABC,,,,,,,,,,
20180301050630668,ABC,,,,,,,,,,

如果您有任何问题,请告诉我。

答案 1 :(得分:1)

只需添加一个管道。

awk -F "," '$2=="ABC"' < "$i" |
sort -n >> "$filename"

在一般情况下,要对第234列进行排序,请尝试sort -t, -k234,234n

请注意"$i"周围的引用,就像你已经有"$filename"一样,以及Awk脚本的简化。

答案 2 :(得分:1)

如果您使用的是gawk,则可以执行以下操作:

$ awk -F "," -v OFS="," '$2=="ABC"{a[$1]=$0}         # Filter lines that have "ABC"
                         END{ # set the sort method
                             PROCINFO["sorted_in"] = "@ind_num_asc"   
                             for (e in a) print a[e] # traverse the array of lines
                         }' file

另一种方法是使用sedsort

sed -n '/^[0-9]*,ABC,/p' file | sort -t, -k1 -n   

请记住,这两种方法都与使用的shell无关。 Bash只是执行操作系统的其他工具(sedawksort等)。

Bash本身可以在纯Bash中进行排序,但它会