排序一行中的字段

时间:2014-09-17 16:55:01

标签: sorting unix

输入:

87    6,1,9,13
3     9,4,14,35,38,13
31    3,1,6,5

(即制表符分隔的列,其中第二个字段是逗号分隔的无序整数列表。)

期望的输出:

87    1,6,9,13
3     4,9,13,14,35,38
31    1,3,5,6

目标:
对于每行单独,对出现在第二个字段中的逗号分隔列表进行排序。即分别为每一行排序第二列

注意:的行应该重新排序。

我尝试过的事情:

sort - 由于行的顺序不应更改,因此sort根本不适用。

awk - 由于较大的文件是制表符分隔的,而不是逗号分隔的,因此它无法将第二列解析为多个"子字段"

可能有一种perl方式?我对perl一无所知......

3 个答案:

答案 0 :(得分:2)

可以通过简单的perl one liner:和shell(perl -F'/\t/' -alne'$s=join",",sort{$a<=>$b}split",",$F[1];print"$F[0]\t$s"' )来完成:

bash

答案 1 :(得分:1)

while read LINE; do 
   echo -e "$(echo $LINE | awk '{print $1}')\t$(echo $LINE | awk '{print $2}' | tr ',' '\n' | sort -n | paste -s -d,)"; 
done < input

显然这里有很多事情,所以我们走了:

  • input包含您的输入
  • $(echo $LINE | awk '{print $1}')打印第一个字段,非常简单
  • $(echo $LINE | awk '{print $2}' | tr ',' '\n' | sort -n | paste -s -d,)打印第二个字段,但是通过用换行符(tr ',' '\n')替换逗号将其分解为行,然后按数字排序,然后将这些行组合回逗号分隔的值({{ 1}})。

paste -s -d,

答案 2 :(得分:0)

另一种方式: echo happybirthday|awk '{split($0,A);asort(A); for (i=1;i<length(A);i++) {print A[i]}}' FS=""|tr -d '\n';echo aabdhhipprty

恢复登录信息后,我不知道如何返回此页面,所以以访客身份发布。