我可以使用哪些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
令人印象深刻的性能肯定是主要目标之一。