根据特定字符出现的次数在bash中进行排序

根据特定字符出现的次数在bash中进行排序

我需要根据一行中的字符数对文本文件进行排序,然后如果两行中的字符数相同,则根据空白字符(即空格)的最少数量对其进行排序。我得到了第一部分,但不知道该怎么做第二部分。有人能给我点建议吗?

答案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

第一列是字符数,第二列是空格数。

然后我们将其通过管道传输到sortsort完成工作,毕竟我可以使用 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

借贷@ByteCommander 的输入示例

$ 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.

相关内容