【问题标题】:How can I sort text data by timestamp in powershell如何在powershell中按时间戳对文本数据进行排序
【发布时间】:2021-04-22 23:15:40
【问题描述】:

所以,我有一些看起来像这样的数据:

19/10/2020 05:57:08.200, 362173.64, 4498564.26, 10.000, 10.000,   0.000, 0, 3.2,  
19/10/2020 05:57:08.270, 362173.64, 4498564.38, 10.000, 10.000,   0.000, 0, 3.2,  
19/10/2020 05:57:08.340, 362173.64, 4498564.49, 10.000, 10.000,   0.000, 0, 3.2,  
19/10/2020 05:57:08.410, 362173.64, 4498564.61, 10.000, 10.000,   0.000, 0, 3.7,  
19/10/2020 05:57:08.470, 362173.64, 4498564.72, 10.000, 10.000,   0.000, 0, 2.8,  

我需要按时间戳对数据进行排序。在 linux 下,我会通过 awk 运行这些数据,以区分日期和时间,如下所示:

2020 05 10 19 57 08.200  362173.64  4498564.26  10.000  10.000    0.000  0  3.2  
2020 05 10 19 57 08.270  362173.64  4498564.38  10.000  10.000    0.000  0  3.2  
2020 05 10 19 57 08.340  362173.64  4498564.49  10.000  10.000    0.000  0  3.2  

使用这样的命令:

awk -F'[/:,]' '{print $3,$2,$1,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14}'

然后通过 sort 运行它,然后通过 awk 将列放回正确的顺序。

awk -F'[/:,]' '{print $3,$2,$1,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14}' | sort | 
awk -F' ' '{print $3"/"$2"/"$1,$4":"$5":"$6","$7","$8","$9","$10","$11","$12","$13","$14}'

有没有更好的方法在 powershell 中做到这一点,或者至少有一种方法可以做同样的事情?我有一个 powershell 脚本,它非常笨拙地做了类似的事情,但是在这个过程中的某个地方我丢失了换行符......

$nav = (gc $navfile | %{$_ -replace ", ",","} | %{$_ -replace "  ",""} | %{"$($_.Split('[/,:]')[2,1,0,3,4,5,6,7,8,9,10,11,12,13,14])"} | sort-object | %{"$($_.Split(' ')[2,1,0,3,4,5,6,7,8,9,10,11,12,13,14])"} )  

[regex]$sorted = " "


$one = $sorted.replace($nav, "/", 2)  
$two = $sorted.replace($one, "!", 1)  
$three = $sorted.replace($two, ":", 2)  
$four = $three | %{$_ -replace " ",","}  
$five = $four | %{$_ -replace "!"," "}  
$six = $five | %{$_ -replace ",,","`n"}  
echo $six  

任何帮助将不胜感激。

【问题讨论】:

  • "powershell" 是 Windows 的东西,对吧?如果您在 Windows 上,那么您正在使用 GNU awk,而 GNU awk 带有它自己的 sort 功能,所以 - 为什么不直接在 1 次调用 awk 中完成所有工作呢?如果您 edit 您的问题显示预期输出,那么我们可以帮助您 - 我尝试运行您在发布的数据上提供的 awk | sort | awk 管道,但输出没有意义,所以我假设脚本或示例输入实际上是不正确的。您发布的示例输入不是已经按时间戳排序了吗?如果是这样,那对测试排序功能就没用了。
  • @EdMorton powershell 是可用于LinuxmacOS 的通用shell
  • 我正在制作一个便携式工具供其他人在 windows 下使用,这就是我在 powershell 中工作的原因。示例中的数据恰好已排序,但完整数据未排序。我可能在解释 awk 代码时遗漏了一些东西,但我在 linux 下有一个正常运行的脚本。
  • 在提出问题时,重要的是要显示一个 minimal reproducible example 来说明问题(因此,如果您的问题是如何对数据进行排序,请为样本输入提供未排序的数据,并为预期的输入提供相同的数据输出)以及按照您提供的示例所说的实际代码。否则,这就像在您真正有一匹马时请您的机械师帮助您启动汽车一样。

标签: regex powershell sorting date awk


【解决方案1】:

在 PowerShell 中,您可以使用 the Sort-Object cmdlet - 而且您根本不需要修改源文件:

Get-Content $navfile |Sort-Object {
  [datetime]::ParseExact($_.Substring(0, 23), 'dd/MM/yyyy HH:mm:ss.fff', $null)
}

$_.Substring(0, 23) 表达式将提取前 23 个字符,即。 19/10/2020 05:57:08.200。然后[datetime]::ParseExact() 调用将生成的字符串解析为格式为dd/MM/yyyy HH:mm:ss.fff 的时间戳,然后将生成的[datetime] 值用作排序键。

【讨论】:

  • 非常感谢!
【解决方案2】:

如果您的输入确实未排序:

$ cat file
21/10/2020 05:57:08.470, 362173.64, 4498564.72, 10.000, 10.000,   0.000, 0, 2.8,
19/10/2020 05:57:08.340, 362173.64, 4498564.49, 10.000, 10.000,   0.000, 0, 3.2,
08/10/2020 05:57:08.270, 362173.64, 4498564.38, 10.000, 10.000,   0.000, 0, 3.2,
19/10/2020 05:57:08.410, 362173.64, 4498564.61, 10.000, 10.000,   0.000, 0, 3.7,
19/10/2020 05:57:08.200, 362173.64, 4498564.26, 10.000, 10.000,   0.000, 0, 3.2,

这里是您可以使用 GNU awk 按日期+时间对其进行排序的方法:

$ awk -F'[/ ]' '
    { rec[$3 $2 $1 $4] = $0 }
    END { PROCINFO["sorted_in"]="@ind_str_asc"; for (ts in rec) print rec[ts] }
' file
08/10/2020 05:57:08.270, 362173.64, 4498564.38, 10.000, 10.000,   0.000, 0, 3.2,
19/10/2020 05:57:08.200, 362173.64, 4498564.26, 10.000, 10.000,   0.000, 0, 3.2,
19/10/2020 05:57:08.340, 362173.64, 4498564.49, 10.000, 10.000,   0.000, 0, 3.2,
19/10/2020 05:57:08.410, 362173.64, 4498564.61, 10.000, 10.000,   0.000, 0, 3.7,
21/10/2020 05:57:08.470, 362173.64, 4498564.72, 10.000, 10.000,   0.000, 0, 2.8,

显然这是在 Unix 上运行的 - 酌情应用 Windows 魔术引用规则(或将脚本保存在文件中并以 awk -f script file 运行)。

【讨论】:

  • 哇!你能解释一下吗?这是一件美丽的事情。
  • 我不明白你的 awk 代码在做什么,但是当我运行它时,输出是未排序的。
  • @SamAlleman 它只是创建一个由日期+时间值索引的记录数组(每行输入都是一条记录),然后按索引的顺序打印该数组的内容,请参阅@987654321 @。如果你得到的输出没有排序,那么要么你没有使用 GNU awk,要么你使用的是不支持 sorted_invery 旧版本,或者你的真实输入不' t 看起来像您提供的示例。如果不明显,请在其中添加一些打印语句以转储使用的值。
  • 啊,我使用的是 mawk,而不是 gnu awk。让我再试一次。谢谢!
  • 对,mawk 传统上是为提高执行速度而设计的功能最少的 awk,而 gawk 是为增强功能而设计的功能丰富的。此外,sort 是专门设计用于对数据进行排序的实用程序,因此您应该期望它能够比其他仅将排序作为额外功能的工具更快地完成此操作。话虽如此 - 一半的速度听起来很多,我想知道您正在运行的脚本是否正在执行我展示的内容或其他可能会减慢速度的事情,我想知道您是否进行了第 3 次运行计时或如果您遇到缓存影响。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多