【问题标题】:How to sort strings in a file numerically如何对文件中的字符串进行数字排序
【发布时间】:2021-07-02 02:03:10
【问题描述】:

在我的批处理脚本中会有一个临时文件,其中包含一个部分中的注释(从 json 文件中获取,但没关系)

格式: (以毫秒为单位的音符位置),(音符种类),(如果不是 0,则应该保持音符,这是应该保持音符的时间毫秒)

(格式不重要)

但有时它没有排序

例子:

2285.71428571429,0,0
2367.85714285714,0,0
2455.35714285714,0,0
2576.78571428571,1,0
2757.14285714286,1,0
3046.42857142857,0,0
2962.5,1,0
3128.57142857143,0,0
3216.07142857143,0,0
3298.21428571429,1,0
3380.35714285714,1,0
2669.64285714286,3,0
2882.14285714286,3,0


所以我想对它们进行排序,但排序命令无法正确排序

预期结果:

2285.71428571429,0,0
2367.85714285714,0,0
2455.35714285714,0,0
2576.78571428571,1,0
2669.64285714286,3,0
2757.14285714286,1,0
2882.14285714286,3,0
2962.5,1,0
3046.42857142857,0,0
3128.57142857143,0,0
3216.07142857143,0,0
3298.21428571429,1,0
3380.35714285714,1,0

订单项不需要排序。该行需要排序。

【问题讨论】:

  • 最后2个数字并不重要它需要对每一行进行排序

标签: powershell batch-file


【解决方案1】:

您说,格式并不重要所以我选择了表格输出。看到您的输入似乎是 csv 格式,我们可以使用powershellImport-Csv 函数将, 上的数据分隔符拉入,然后使用Sort-Object 对十进制数进行相应的排序。

在这里,我们将Col1 的标题设置为Col3(根据您的示例),然后对Col1 进行排序,其余列保持不变。

$file = Import-Csv -Header "Col1", "Col2", "Col3" -delimiter ',' test.txt
$file | Sort-Object { [double]$_.Col1 } | Format-Table -AutoSize -Wrap

结果:

PS Z:\> $file | Sort-Object -Descending { [double]$_.Col1 } | Format-Table -AutoSize -Wrap

Col1             Col2 Col3
----             ---- ----
2285.71428571429 0    0
2367.85714285714 0    0
2455.35714285714 0    0
2576.78571428571 1    0
2669.64285714286 3    0
2757.14285714286 1    0
2882.14285714286 3    0
2962.5           1    0
3046.42857142857 0    0
3128.57142857143 0    0
3216.07142857143 0    0
3298.21428571429 1    0
3380.35714285714 1    0

您可以直接从cmd 运行:

powershell "$file = Import-Csv -Header "Col1", "Col2", "Col3" -delimiter ',' test.txt; $file | Sort-Object { [double]$_.Col1 } | Format-Table -AutoSize -Wrap"

结果:

PS Z:\> $file | Sort-Object -Descending { [double]$_.Col1 } | Format-Table -AutoSize -Wrap

Col1             Col2 Col3
----             ---- ----
2285.71428571429 0    0
2367.85714285714 0    0
2455.35714285714 0    0
2576.78571428571 1    0
2669.64285714286 3    0
2757.14285714286 1    0
2882.14285714286 3    0
2962.5           1    0
3046.42857142857 0    0
3128.57142857143 0    0
3216.07142857143 0    0
3298.21428571429 1    0
3380.35714285714 1    0

或混合到batch-file 并使用, 连接变量,为您提供与输入相同的输出结果:

@for /F "skip=3 tokens=1-3" %%i in ('powershell "$file = Import-Csv -Header "Col1", "Col2", "Col3" -delimiter ',' test.txt; $file | Sort-Object { [double]$_.Col1 }"') do @echo(%%i,%%j,%%k

结果:

Z:\>sort_object-Int.cmd
2285.71428571429,0,0
2367.85714285714,0,0
2455.35714285714,0,0
2576.78571428571,1,0
2669.64285714286,3,0
2757.14285714286,1,0
2882.14285714286,3,0
2962.5,1,0
3046.42857142857,0,0
3128.57142857143,0,0
3216.07142857143,0,0
3298.21428571429,1,0
3380.35714285714,1,0

【讨论】:

  • 这确实有效,但这是我发现的:这确实有效,但这是我发现的:==================== Col1 COL2 COL3 ---- ---- ----2285.714285714285711/0222285711 3128.57142857143 0 0 3216.07142857143 0 0 3298.21428571429 1 0 3380.35714285714 1 0 ====================
  • 很难阅读,但在 col3 的一个数字中,有一个 0 也有一个“...”我可以注意到的是,有一个“0...”的行是文件中原始字符串的最后一行。原始文件末尾还有空行,实际上并没有做任何事情
  • 如果没有看到输入数据的实际示例,很难说出原因。如果您可以通过复制和粘贴的方式发布问题中数据的最后一部分,我可以看看为什么。
  • 这里是输入文件的粘贴箱和powershell的输出:pastebin.com/rnuqG7Uh
  • ok,是因为表格被截断了,加| Format-Table -AutoSize -Wrap修复见编辑。
猜你喜欢
  • 2018-04-02
  • 2011-01-23
  • 2021-09-19
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2012-04-12
  • 2011-12-27
相关资源
最近更新 更多