Sorting 对行中的字段进行排序

Sorting 对行中的字段进行排序,sorting,unix,Sorting,Unix,输入: (即,以制表符分隔的列,其中第二个字段是以逗号分隔的无序整数列表。) 期望输出: 87 6,1,9,13 3 9,4,14,35,38,13 31 3,1,6,5 目标: 对于每一行,分别对出现在第二个字段中的逗号分隔列表进行排序。i、 e.分别对每行的第二列进行排序 注意:这些行不应重新排序 我所尝试的: sort-由于行的顺序不应更改,因此sort根本不适用 awk-由于较大的文件以制表符分隔,而不是逗号分隔,因此无法将第二列解析为多个“子字段” 可能有一种pe

输入:

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

期望输出:

87    6,1,9,13
3     9,4,14,35,38,13
31    3,1,6,5
目标:
对于每一行,分别对出现在第二个字段中的逗号分隔列表进行排序。i、 e.分别对每行的第二列进行排序

注意:这些行不应重新排序

我所尝试的:

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

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


可能有一种perl方法?我对perl一无所知……

这可以通过简单的perl oneliner完成:

87    1,6,9,13
3     4,9,13,14,35,38
31    1,3,5,6
perl-F'/\t/'-alne'$s=join“,”,sort{$a$b}split“,”,$F[1];打印“$F[0]\t$s”
还有shell(
bash
)一个:

读取a b时;执行echo-e“$a\t$(echo$b | tr'\n'| sort-n | tr'\n',| sed's/,$/”);完成
另一种方式:
echo happybirthday | awk'{split($0,A);asort(A);for(i=1;iBut'awk'{print$2}}}}}{tr','\n'将只产生一个大列,例如我的示例:“1\n6\n9\n13\n9\n4\n13…”-这样,您就不知道哪些字段属于哪一行,而不应该属于哪一行。每一行都被单独处理。列表被分解为多行,以便可以对其进行排序,但随后
粘贴
命令会将其作为一行放回。您是否得到不同的输出?
awk'{print$2}|tr',''\n''打印第二列并将其导入
tr`实用程序。但我认为,
awk
命令将首先“完成”(即为每个条目打印第二列),然后将整个结果作为一个输入输入到
tr
中。然后
tr
将立即对整个输入进行操作-导致一个聚合的单列列表-从而丢失原始条目。我错了吗?在这种情况下,
awk
只在一行上起作用。将
awk
视为一种可能的过度使用>通常适用于多行:
cat输入| awk'{print$2}'
(我知道这是一个不必要的
cat
,只是证明了一点)将打印整个文件的第二列,因为您正在将
cat
的整个输出传递给
awk
。如果您只使用一行的
echo
,这同样适用;您正在将一些输入传递给命令。哦,是的,现在我明白了-因此在读取时循环了
。我现在明白了。谢谢
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
$ cat input
87    6,1,9,13
3     9,4,14,35,38,13
31    3,1,6,5

$ 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
87      1,6,9,13
3       4,9,13,14,35,38
31      1,3,5,6