Linux 按上次出现的键进行bash排序

Linux 按上次出现的键进行bash排序,linux,bash,sorting,Linux,Bash,Sorting,我想对每行末尾标有@加一个数字的一些文件进行排序。问题是你可以在每行中找到@不止一次。该文件可能类似于: '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 myFi

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

'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的解决方案,但在我的例子中,它似乎失败了


欢迎提供任何帮助。

请您尝试以下结合
rev
+
sort
(使用显示的示例编写和测试,并在看到Cyrus的注释数字后使用单个数字)

逻辑解释:

  • 首先按相反顺序(从最后一个字符到第一个字符)打印输入_文件
  • 现在,最后的数字成为so的第一个字段,将其输出传递给
    sort
    命令,以按数字对其进行排序
  • 将其排序后,再次使用
    rev
    以实际形式生成输入文件
带awk和切割:

awk -F '@' '{print $NF,$0}' file | sort -n | cut -d " " -f 2-
$NF包含最后一列

输出:

'Hi' @5 'Hello from line 1' @1 'Hello from line 2' @2 'Hello from line 3' @3
a@1
b@1
a@2
b@2
1@3
a@3
1@4
a@4
“你好”@5“你好,来自第1行”@1 “第二行你好”@2 “第三行你好”@3
第一行用ASCII字符替换每行中的最后一个@(该字符不太可能出现在输入的其他地方),第二列使用US作为字段分隔符进行排序,然后最终将美国变成GNU awk中的@.

一个,它将记录散列到二维数组
a
,排序时使用
PROCINFO[“sorted_in”]
控制
遍历。首先是一个有点变化的示例:

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
输出:

'Hi' @5 'Hello from line 1' @1 'Hello from line 2' @2 'Hello from line 3' @3
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

数字可以超过一位数吗?是的@Cyrus数字可以超过一位数。谢谢Cyrus,我将使用您的解决方案@RavinderSingh13感谢您的解决方案,但它不适用于超过一位数的数字,对不起,在我的示例中,我只使用了一位数,我应该在回答问题时澄清这一点。我不理解问题中的-1,我只是一个使用bash的新手,我只知道基本命令。感谢所有的解决方案,我将对它们进行分析,以了解有关排序的更多信息。