linux - 我可以使用哪些 linux 命令对制表符分隔的文本文件中的列进行排序?

标签 linux sorting awk

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

<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

我需要的是:

  1. 按行对文件排序
  2. 对每行中的标记进行排序,使其按字母顺序排列

所以对于上面的例子,结果是

fileB<tab>Y
fileM<tab>B<tab>C<tab>M<tab>Y
fileX<tab>A<tab>M<tab>Z

使用 sort 很容易做到#1,但如何做到#2?

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

最佳答案

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["sorted_in"]="@ind_str_asc" - 排序模式

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

  • asort(b) - 对标记值进行排序

关于linux - 我可以使用哪些 linux 命令对制表符分隔的文本文件中的列进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45086660/

相关文章:

mysql - 按最后 2 个字符对字符串列表进行排序

bash - 使用 "Sort"根据时间戳对终端中的 CSV 进行排序

linux - 表格式化 shell 脚本

android - DDMS 和虚拟创建器在 Eclipse 中不起作用

JavaScript 对具有相同项目的数组进行排序

特定日期后文件夹中的 linux cat 文件用 awk 传输

linux - AWK : matching two files by first column doesn't work

arrays - shell中输入的数字

linux - ash 文件的结构如何?

linux - 制作 Centos 备份的 Shell 脚本