按键的最后出现次数排序

问题描述 投票:0回答:1

我想对一些在每行末尾标有@加数字的文件进行排序。问题是你可以在每行中找到不止一次的@。这个文件可以是这样的。

'Hello from line 2' @2
'Hello from line 3' @3
'Hi' @5 'Hello from line 1' @1

我希望我的输出能像这样排序

'Hi' @5 'Hello from line 1' @1
'Hello from line 2' @2
'Hello from line 3' @3

但是@5挡住了,我已经测试过了:

cat myFile.txt | sort -t@ -k2

但@并不在特定的列中,而是在最后一列。我已经看到了一些解决方案,在这个网站上使用awk,但它似乎在我的情况下失败。

任何帮助是欢迎的。

linux bash sorting
1个回答
3
投票

Schwartzian 变换 用awk和cut。

awk -F '@' '{print $NF,$0}' file | sort -n | cut -d " " -f 2-

$NF包含最后一列。

输出: 'Hi' @5 '第1行的你好' @1'第2行的你好' @2'第3行的你好' @3'第4行的你好

'你好' @5 '第一行的你好' @1'第二行的你好' @2'第三行的你好' @3

2
投票

请您尝试以下组合 rev + sort编写并测试了显示的样本,看到Cyrus的评论后,数字是个位数)。

rev Input_file | sort -n | rev

邏輯上的解釋。

  • 首先以相反的顺序打印Input_file(从最后一个字符到第一个字符)。
  • 现在,最后一位数字变成了第一个字段,所以将其输出传给了 sort 命令对其进行数字排序。
  • 排序后,再使用 rev 使Input_file成为实际的形式。

0
投票
$ sed 's/@\([^@]*\)$/'$'\37''\1/' input.txt | sort -t $'\37' -k2,2n | tr $'\37' '@'
'Hi' @5 'Hello from line 1' @1
Hello from line 2' @2
'Hello from line 3' @3

这首先将每行中的最后一个 @ 替换为 ASCII 字符。汽水分离器 字符(在你的输入中不太可能出现),用US作为字段分隔符对第二列进行排序,最后把US变成@。


0
投票

在GNU awk中,有一个将记录散列为二维数组的方法。a 和分类使用 PROCINFO["sorted_in"] 以控制 for 遍历。首先是一个位改变的样本。

b@1
a@3
1@3
a@2
1@4
b@2
a@1
a@4

然后是程序

$ gawk 'BEGIN {
    FS="@"                                        # field separator
}
{
    a[$NF][++c[$NF]]=$0                           # hash records, 1st dim i the 
}                                                 # number, 2nd serial of each 
END {                                             # each number if duplicates
    PROCINFO["sorted_in"]="@ind_num_asc"          # 1st dim, sort in index value
    for(i in a) {
        PROCINFO["sorted_in"]="@val_str_asc"      # 2nd dim, sort on array value
        for(j in a[i])
            print a[i][j]
        # PROCINFO["sorted_in"]="@ind_num_asc"    # not sure if needed, seems like not
    }
}' file

输出:

a@1
b@1
a@2
b@2
1@3
a@3
1@4
a@4

...或用你的数据。

'Hi' @5 'Hello from line 1' @1
'Hello from line 2' @2
'Hello from line 3' @3
© www.soinside.com 2019 - 2024. All rights reserved.