我需要根据第一列中的字符数对文件进行排序。
我不知道该怎么做。 (在 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
从中删除第一列。