我希望该-g
标志告诉sort
将字段视为浮点数,但是:
cat << EOF | sort -g -k1,2
0 0
0 1.0
0 .5
0 5.0
EOF
给出
0 0
0 1.0
0 .5
0 5.0
因此.5
不被视为0.5
。这是一个已知错误还是什么?
附言:我不是在寻求解决方法,我已经解决了sed
我希望该-g
标志告诉sort
将字段视为浮点数,但是:
cat << EOF | sort -g -k1,2
0 0
0 1.0
0 .5
0 5.0
EOF
给出
0 0
0 1.0
0 .5
0 5.0
因此.5
不被视为0.5
。这是一个已知错误还是什么?
附言:我不是在寻求解决方法,我已经解决了sed
我有一个非常大的文件,我想按字母顺序排序。它是一个制表符分隔的文件,但我确实需要确保该文件是按行中的第一个字符开始排序的,无论它是空格还是其他任何字符。
输入文件示例:
2090802 V19 I must be the third in the group
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V17 I must be the second in the group
2090802 V16 I must be the first in the group of 2090802
使用命令sort test.txt > test-s.txt
我得到这个输出:
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V19 I must be the third in the group
排序程序似乎看到第一列具有相同的值(忽略第 3 行中的空格),并使用下一个列(V16、V17、V18 和 V19)对文件进行排序。
但是,我希望该值20908 02
被认为是不同的,我的预期结果应该是这样的:
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group
2090802 V19 I must be the third in the group
我尝试使用-b
参数,并-t
给出另一个分隔符,但仍然没有得到想要的结果。
如何通过考虑行中的每个字符而不忽略空格来对文件进行排序?
我正在修订控制系统中以 JSON 格式跟踪某些系统的配置。
不幸的是,该配置是使用某些闭源专有命令检索的,并且输出从一次运行到下一次运行都会发生变化,因为对象和数组中的顺序或多或少是随机的。
一次,它会输出:
{
"fru": [
{
"name": "foo",
"attr": [
{"name": "colour", "value": "blue"},
{"name": "length", "value": 12}
]
},
{
"name": "bar",
"attr": [
{"name": "colour", "value": "red"},
{"name": "length", "value": 1}
]
}
],
"tags": ["x", "y"]
}
下一次:
{
"tags": ["y", "x"],
"fru": [
{
"name": "bar",
"attr": [
{"name": "length", "value": 1},
{"name": "colour", "value": "red"}
]
},
{
"name": "foo",
"attr": [
{"name": "colour", "value": "blue"},
{"name": "length", "value": 12}
]
}
]
}
这意味着从 PoV 来看git diff
,从一次运行到下一次运行,一切都会发生变化,即使它是完全相同的系统。
在所有数组中,顺序无关。对象的属性中的顺序也并不重要。因此,如果我可以对该输出进行后处理,以便对象和数组的属性和成员的顺序一致,我将保证当系统不更改时输出不会更改,并且所看到的更改git diff
会更多可能会反映系统的变化。
jq -S
通过以下方式让我受益匪浅:
git diff
基于行)。对于上面的例子,这给了我:
{
"fru": [
{
"attr": [
{
"name": "colour",
"value": "blue"
},
{
"name": "length",
"value": 12
}
],
"name": "foo"
},
{
"attr": [
{
"name": "colour",
"value": "red"
},
{
"name": "length",
"value": 1
}
],
"name": "bar"
}
],
"tags": [
"x",
"y"
]
}
和:
{
"fru": [
{
"attr": [
{
"name": "length",
"value": 1
},
{
"name": "colour",
"value": "red"
}
],
"name": "bar"
},
{
"attr": [
{
"name": "colour",
"value": "blue"
},
{
"name": "length",
"value": 12
}
],
"name": "foo"
}
],
"tags": [
"y",
"x"
]
}
这更好,但还没有实现,因为数组没有排序(可以理解)。
请注意,现实生活中的文件更加复杂,其中包含包含更多数组的其他对象数组的数组......
我的想法是解决这个问题,对所有数组进行排序,从基于值的 JSON 字符串表示形式的最深数组开始,例如.fru[0].attr
用{"name": "colour", "value": "blue"}
before排序{"name": "length", "value": 12}
,因为字符串在长度{"name":"colour","value":"blue"}
1之前排序,然后数组用before排序,因为(与按字母顺序移动到前面的属性)排序在 之前。.fru
foo
bar
{"attr":[..."blue"...
attr
name
{"attr":[..."red"...
我可以通过以下方式获取所有数组的路径(深度优先):
$ jq -c '[paths(arrays)]|reverse' a
[["tags"],["fru",1,"attr"],["fru",0,"attr"],["fru"]]
我可以根据数组成员的 JSON 字符串表示形式对数组进行排序:
jq '.array|=sort_by(tojson)'
但是我如何将两者结合起来将第二个应用于第一个返回的所有数组?
或者是否有更好的方法来后处理 JSON 以使顺序保持一致?
如果jq
不是最好的工具,我很乐意考虑perl
的JSON
模块或 ruby/python 等效工具。
我使用的是 Ubuntu 22,我有一个很大的文件树,其中的名称很烦人,其中包含不同位置的数值。就像是:
./2
./2/9
./2/10
./2/8
./1
./1/2
./1/1
./1/11
./11
./11/page 6
./11/page 05
./11/page 4
我想根据数值对其进行排序,忽略诸如“页面”之类的任何内容,以便我得到:
./1/1
./1/2
./1/11
./2/8
./2/9
./2/10
./11/page 4
./11/page 05
./11/page 6
我已经尝试过sort -n
,但即使我只查看一级目录名称,它似乎也没有达到我的预期:
$ find . -mindepth 1 -type d | sort -n
./1
./11
./2
是否有一个方便的花花公子选项“按每个整数(而不是数字)排序”?
我正在尝试根据从低到高开始的字符(第 2 列)和位置(第 3 列)对遗传文件进行排序。我的表在大文件中是这样的
SNP CHR BP A1 A2 effect_allele_frequency BETA standard_error P
rs10875231 1 100000012 T G 0.405 -0.0456807 0.02260471 0.04335677
rs6678176 1 100000827 C T 0.383 0.02553138 0.02287662 0.2645817
rs78590530 1 100000948 A G 0.016 0.171376 0.08757958 0.05035017
rs149636485 1 100001060 A G 0.004 -0.03363731 0.1819208 0.8529224
我想以一种方式订购 CHR(从 1 到 22),该位置也从低到高无视其他列并分别为每个 chr 开始。我试过这个排序命令
sort -t $'\t' -nk3 myfile.tsv | sort -t $'\t' -nk2 > test.txt
它在 chr(第 2 列)而不是位置(第 3 列)中给出顺序。似乎第 1 列会干扰:
SNP CHR BP A1 A2 effect_allele_frequency BETA standard_error P
rs1000033 1 226580387 G T 0.416 0.02958699 0.02295015 0.1971771
rs1000050 1 162736463 T C 0.378 0.06136397 0.02293639 0.007468015
rs1000070 1 222359612 C T 0.381 0.02563547 0.02294139 0.2638107
rs1000073 1 157255396 G A 0.387 -0.01470793 0.02273634 0.517414
rs1000085 1 66857915 C G 0.024 -0.03536382 0.07555889 0.6394446
rs1000127 1 63432716 C T 0.157 0.003052272 0.03045933 0.919875
如何仅按第 2 列然后第 3 列排序?
我正在运行 Ubuntu 20.0.4。
考虑以下文件的这些内容(假设文件名为input
)...
/zzzzz foo bar
/hij zzz
xyz abc
/abc
ijk lmnop
qwer tyuiop
abc def
如果我运行/bin/sort input
,我会得到以下输出......
/abc
abc def
/hij zzz
ijk lmnop
qwer tyuiop
xyz abc
/zzzzz foo bar
如您所见,排序算法完全忽略了前导斜杠。手册页中没有sort
任何内容说明正斜杠以任何特殊方式处理。
但是,如果我用字符替换每个正斜杠,$
则不会发生这种行为。例如,假设一个名为的文件newinput
包含这些值...
$zzzzz foo bar
$hij zzz
xyz abc
$abc
ijk lmnop
qwer tyuiop
abc def
换句话说,除了字符已更改为字符之外,newinput
与 相同。当我这样做时,我得到这些结果......input
/
$
/bin/sort newinput
$abc
$hij zzz
$zzzzz foo bar
abc def
ijk lmnop
qwer tyuiop
xyz abc
如您所见,在这种情况下,$
确实被视为正常的可排序字符/bin/sort
。
那么,这里发生了什么?我如何引起/bin/sort
对/
角色的关注?
提前感谢您的任何想法和建议。
更新:如果我在 Debian 下执行此操作,则排序工作正常,无论是/
和$
.
所以,我想知道这种行为是否可能是 Ubuntu 的“功能”。
这是我的制表符分隔文件 t.tsv:
$ cat t.tsv
2022/05/05 -258.03
2022/05/07 -18.10
2022/05/09 -10.74
2022/05/09 -132.60
2022/05/12 -18.56
2022/05/12 -20.20
2022/05/17 -11.00
2022/05/17 -112.91
2022/05/17 -51.43
2022/05/17 -64.78
2022/05/18 -13.96
2022/05/18 -13.96
2022/05/18 -7.51
2022/05/19 -17.08
2022/05/20 -33.08
我正在使用 MacOS 12.4 排序(来自手册页:排序实用程序符合 IEEE Std 1003.1-2008 (“POSIX.1”) 规范)首先按 alpha seq 升序按 col 1 排序,然后按数字升序按 col2 排序。
$ cat t.tsv|sort --field-separator='\t' --key=1,1 --key=2,2n
2022/05/05 -258.03
2022/05/07 -18.10
2022/05/09 -10.74
2022/05/09 -132.60
2022/05/12 -18.56
2022/05/12 -20.20
2022/05/17 -11.00
2022/05/17 -112.91
2022/05/17 -51.43
2022/05/17 -64.78
2022/05/18 -13.96
2022/05/18 -13.96
2022/05/18 -7.51
2022/05/19 -17.08
2022/05/20 -33.08
我很困惑为什么当第一列相同时,第二列没有按升序数字顺序排序。许多 SE 对同一问题的回答都说(a)您将单个列指定为--key=1,1
,并且(b)您可以将选项-n
应用于单个键定义,例如--key=2,2n
.
更新:我应该提到我的外壳是bash
.
直到现在,我一直在使用sort -u
摆脱重复项。
但我对软件工具生成的列表有真正的疑问。
问题是:输出是否sort -u |wc
与 相同uniq -u |wc
?
因为它们不会产生相同的结果。手册uniq
规定:
-u, --unique 只打印唯一的行
我的输出由 1110 个单词组成,其中sort -u
保留了 1020 行和uniq -u 1110
正确的数量。问题是我无法直观地发现通过>
在命令行末尾使用生成的列表中的任何重复项,并且总破解密码存在问题(在自定义开膛手 john 的上下文中)。
以下是文件示例
585.3 M netG ple jdhe jdhe_daily se 1732 pcv DC month 202204 day 20220413
585.5 M netG ple jdhe jdhe_daily se 1734 pcv DC month 202204 day 20220413
585.8 M netG ple jdhe jdhe_daily se 1733 pcv DC month 202204 day 20220413
585.9 M netG ple jdhe jdhe_daily se 1731 pcv DC month 202203 day 20220304
586.1 M netG ple jdhe jdhe_daily se 1732 pcv DC month 202203 day 20220304
586.5 M netG ple jdhe jdhe_daily se 1735 pcv DC month 202204 day 20220413
587.1 M netG ple jdhe jdhe_daily se 1734 pcv DC month 202203 day 20220304
587.3 M netG ple jdhe jdhe_daily se 1733 pcv DC month 202203 day 20220304
587.4 M netG ple jdhe jdhe_daily se 1736 pcv DC month 202204 day 20220413
587.4 M netG ple jdhe jdhe_daily se 1737 pcv DC month 202204 day 20220413
587.7 M netG ple jdhe jdhe_daily se 1738 pcv DC month 202204 day 20220413
588.0 M netG ple jdhe jdhe_daily se 1735 pcv DC month 202203 day 20220304
594.3 M netG ple jdhe jdhe_daily se 1730 pcv DC month 202205 day 20220515
594.3 M netG ple jdhe jdhe_daily se 1737 pcv DC month 202203 day 20220303
我们想将最后一个字段上的日期从旧日期排序到新日期
剂量sort
命令支持根据最后一个字段对数字进行排序吗?