我是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)按升序对行进行排序?
答案 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
另一种方法是使用sed
和sort
:
sed -n '/^[0-9]*,ABC,/p' file | sort -t, -k1 -n
请记住,这两种方法都与使用的shell无关。 Bash只是执行操作系统的其他工具(sed
,awk
,sort
等)。
Bash本身可以在纯Bash中进行排序,但它会长和慢。