我可以使用哪些linux命令对选项卡分隔文本文件中的列进行排序?

我可以使用哪些linux命令对选项卡分隔文本文件中的列进行排序?,linux,sorting,awk,Linux,Sorting,Awk,我需要比较同一文件的两个版本。两者都以制表符分隔,并具有以下形式: <filename1><tab><Marker11><tab><Marker12>... <filename2><tab><Marker21><tab><Marker22><tab><Marker22>... 。。。 ... 因此每一行都有不同数量的标记(数量在1到10之间变化),它

我需要比较同一文件的两个版本。两者都以制表符分隔,并具有以下形式:

<filename1><tab><Marker11><tab><Marker12>...
<filename2><tab><Marker21><tab><Marker22><tab><Marker22>...
。。。
...
因此每一行都有不同数量的标记(数量在1到10之间变化),它们都来自一小部分可能的标记。因此,文件如下所示:

fileX<tab>Z<tab>M<tab>A
fileB<tab>Y
fileM<tab>M<tab>C<tab>B<tab>Y
fileXZMA
菲尔比
fileMMCBY
我需要的是:

  • 按行对文件排序
  • 将每行中的标记按字母顺序排序
  • 对于上面的例子,结果是

    fileB<tab>Y
    fileM<tab>B<tab>C<tab>M<tab>Y
    fileX<tab>A<tab>M<tab>Z
    
    fileBY
    fileMBCMY
    fileXAMZ
    
    使用
    sort
    很容易做到#1,但如何做到#2

    更新:它不是的副本,因为我的行的长度不同,我需要对每行(文件名后的条目)进行单独排序,即唯一保留的列是第一列。

    awk解决方案:

    awk 'BEGIN{ FS=OFS="\t"; PROCINFO["sorted_in"]="@ind_str_asc" }
         { split($0,b,FS); delete b[1]; asort(b); r=""; 
             for(i in b) r=(r!="")? r OFS b[i] : b[i]; a[$1] = r 
         }
         END{ for(i in a) print i,a[i] }' file
    
    输出:

    fileB   Y
    fileM   B   C   M   Y
    fileX   A   M   Z
    

    • PROCINFO[“已排序”]=“@ind\u str\u asc”
      -排序模式

    • split($0,b,FS)-通过
      FS
      (字段分隔符)将行拆分为数组
      b

    • asort(b)
      -排序标记值

    您只需要:

    awk '
    { for (i=2;i<=NF;i++) arr[$1][$i] }
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        for (i in arr) {
            printf "%s", i
            for (j in arr[i]) {
                printf "%s%s, OFS, arr[i][j]
            }
            print ""
        }
    }
    ' file
    
    awk'
    
    {对于(i=2;我可能是好答案的副本。如果awk中排序数组上的一次(在xxx年内:)可预测的迭代是POSIX,那就太好了。我只建议显式使用
    gawk
    ,而不是
    awk
    (这也是一种广告;))实际上,当排序数组被添加到引擎盖下时,它不应该破坏任何东西。Python3.7对
    dict
    类型也做了同样的操作。假定数组未排序的代码应该仍然有效。默认排序数组的问题是没有比任何其他顺序更好的顺序(字母?数字?先入?递增?递减?等),因此哈希顺序作为默认顺序是最好的,因为它是最有效的。我明白了。
    awk
    令人印象深刻的性能肯定是主要目标之一。