根据列/行的长度对文件进行排序

根据列/行的长度对文件进行排序

我需要根据第一列中的字符数对文件进行排序。

我不知道该怎么做。 (在 Linux 上,因此 sed/awk/sort 可用)。

一个例子:

.abs is bla bla 12
.abc is bla se 23 bla
.fe is bla bla bla
.jpg is pic extension
.se is for swedish domains

我想要的是根据每行第一列的长度对这些行进行排序。有些行以 4 个字符开头,有些以 3 或 2 个字符开头。我希望结果类似于:

.fe is bla bla bla
.se is for swedish domains
.abs is bla bla 12
.abc is bla se 23 bla
.jpg is pic extension

这可能吗?

答案1

awk您可以首先使用, do添加另一个包含字符数的列,sort然后删除添加的列:

awk '{printf "%d %s\n", length($1), $0}' file.txt | sort -n -k1,1 | sed -E -e 's/^[0-9]+ //'

答案2

您可以使用基本的 shell 工具来完成,但是如果有Perl,你可以更直接地表达你的需求:

perl -l -e 'print sort {@a = split(/ /, $a, 2); @b = split(/ /, $b, 2);
                        length($a[0]) <=> length($b[0])} <>'

随着施瓦茨变换(对于大输入更有效):

perl -l -e 'print map {$_->[0]}
                  sort {length($a->[1]) cmp length($b->[1])}
                  map {[$_, split(/ /, $_, 2)]} <>'

如果你有Python,代码会更冗长但更清晰一些:

python -c 'import sys;
lines = sys.stdin.readlines();
lines.sort(key=lambda line: len(line.split()[0]));
sys.stdout.writelines(lines)'

答案3

$ awk -vOFS='\t' '{ print length($1), $0 }' file.in | sort -k1,1n -k2,2 | cut -f2-
.fe is bla bla bla
.se is for swedish domains
.abc is bla se 23 bla
.abs is bla bla 12
.jpg is pic extension

这将按第一列中数据的长度对文件进行排序file.in,然后按字典顺序对第一列的实际数据进行排序(问题中没有具体要求,但对结果提供了很好的处理)。

awk代码将创建制表符分隔的输出,例如

4       .abs is bla bla 12
4       .abc is bla se 23 bla
3       .fe is bla bla bla
4       .jpg is pic extension
3       .se is for swedish domains

这就是sort在第一列(按数字)然后在第二列(按字典顺序)排序的内容。然后cut从中删除第一列。

相关内容