我需要根据一行中的字符数对文本文件进行排序,然后如果两行中的字符数相同,则根据空白字符(即空格)的最少数量对其进行排序。我得到了第一部分,但不知道该怎么做第二部分。有人能给我点建议吗?
答案1
我会选择awk
这样的:
awk -F " " '{print length($0), NF-1, $0}' file.txt
如果您有多个空间,请使用以下空间:
awk '{NS=gsub(" "," ",$0); print length($0), NS, $0}' file.txt
gsub
将每个空格替换为空格,并返回此过程的计数,即空格的数量。
假设我们有一个包含以下内容的文件:
here is something
here is something el s
here is something else
and agai n
and a a aa
上述命令的输出是:
17 2 here is something
22 4 here is something el s
22 3 here is something else
10 2 and agai n
10 3 and a a aa
第一列是字符数,第二列是空格数。
然后我们将其通过管道传输到sort
并sort
完成工作,毕竟我可以使用 cut 来仅获取原始文件内容:
awk -F " " '{print length($0), NF-1, $0}' file.txt | sort -k1n,2 | cut -f3- -d' '
对于第二种解决方案:
awk '{NS=gsub(" "," ",$0); print length($0), NS, $0}' file.txt | \
sort -k1n,2 | cut -f3- -d' '
最终输出为:
and agai n
and a a aa
here is something
here is something else
here is something el s
你可以-F " "
用你的特定角色说“R”来改变:
awk -F "R" ...
或者
gsub("R","R",$0)
第二个。
答案2
下面是一个可以完成这个任务的 Python 小脚本。请注意,它会在排序之前和输出中删除每一行的所有尾随空格字符。
#!/usr/bin/env python3
import sys
if len(sys.argv) != 2:
print("Error, you must specfy the input file name as only argument!")
exit(1)
lines=[line.rstrip() for line in open(sys.argv[1])]
print(*sorted(sorted(lines, key=lambda b:b.count(" ")), key=lambda a:len(a)),
sep="\n")
如果您想缩短它,请省略第 3-5 行,这几行仅验证是否给出了一个命令行参数,如果不是,则打印一条错误消息。
以下是一次测试运行:(
将脚本另存为sort.py
并使用 使其可执行chmod +x sort.py
)
$ cat loremipsum.txt
Nostrum laboriosam et amet illum consectetur.
Voluptas quos doloribus totam porro inventore.
Molestiae ipsam quis dolores vero a delectus.
Aut cupiditate ullam possimus voluptate et delectus tenetur sint.
Omnis et vitae et blanditiis in et.
Inventore eligendi distinctio perferendis ab.
$ ./sort.py loremipsum.txt
Omnis et vitae et blanditiis in et.
Inventore eligendi distinctio perferendis ab.
Nostrum laboriosam et amet illum consectetur.
Molestiae ipsam quis dolores vero a delectus.
Voluptas quos doloribus totam porro inventore.
Aut cupiditate ullam possimus voluptate et delectus tenetur sint.
答案3
基于高级排序从O'Reilly 的学习perl
,你可以这样做
perl -lne '
push @arr, $_ }{
for $x (sort { length($a) <=> length($b) or $a =~ tr/ // <=> $b =~ tr/ // } @arr) {
print $x
}
' file
$ perl -lne '
> push @arr, $_ }{
> for $x (sort { length($a) <=> length($b) or $a =~ tr/ // <=> $b =~ tr/ // } @arr) {
> print $x
> }
> ' loremipsum.txt
Omnis et vitae et blanditiis in et.
Inventore eligendi distinctio perferendis ab.
Nostrum laboriosam et amet illum consectetur.
Molestiae ipsam quis dolores vero a delectus.
Voluptas quos doloribus totam porro inventore.
Aut cupiditate ullam possimus voluptate et delectus tenetur sint.
如果你有 GNU awk 4.0 或更高版本,你可以做类似的事情 - 尽管自定义排序功能需要更多的工作,例如
$ cat 2sort.awk
#!/usr/bin/gawk -f
function mycmp(ia, a, ib, b) {
n = length(a) - length(b);
return n == 0 ? gsub(/ /,"",a) - gsub(/ /,"",b) : n
}
{arr[NR] = $0}
END {
PROCINFO["sorted_in"] = "mycmp";
for(i in arr) print arr[i];
}
给予
$ ./2sort.awk loremipsum.txt
Omnis et vitae et blanditiis in et.
Inventore eligendi distinctio perferendis ab.
Nostrum laboriosam et amet illum consectetur.
Molestiae ipsam quis dolores vero a delectus.
Voluptas quos doloribus totam porro inventore.
Aut cupiditate ullam possimus voluptate et delectus tenetur sint.