输入:
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一无所知......
答案 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
恢复登录信息后,我不知道如何返回此页面,所以以访客身份发布。