对文件中的各个行进行排序

时间:2014-03-26 06:16:16

标签: bash toolchain gnu-toolchain linux-toolchain

我有一个包含许多行的文件,每行包含一个以逗号分隔的列表。我想对每一行进行排序。

如果我有一行,那就很容易:

<file tr ',' '\n' | sort | tr '\n' ','

但是如果我在我的文件上这样做,它会将我不想要的所有行集中在一起。我如何限制这个?

3 个答案:

答案 0 :(得分:3)

在Perl中(相当)容易:

#!/usr/bin/env perl
use strict;
use warnings;

$, = ",";

while (<>)
{
    chomp;
    my @fields = split /,/;
    my @sorted = sort(@fields);
    $sorted[scalar(@sorted)-1] .= "\n";
    print @sorted;
}

棘手涉及保存已排序的数组,以便可以将换行添加到数组的最后一个元素,这样就不会得到以逗号结尾的行。如果这无关紧要,那么它更紧凑 - 用以下代码替换循环的最后三行:

    print sort(@fields), "\n";

输入

x,b,z,a,c,e,f,g,d
3,19,12,17,16,19,18,17,20,16

输出

a,b,c,d,e,f,g,x,z
12,16,16,17,17,18,19,19,20,3

紧凑代码

它是Perl,有办法压缩它:

perl -l -p -a -F, -e '$_ = join(",", sort(@F))' 

这是:

  • -l autochomp并处理换行符。
  • -p自动读取每个输入行,使用脚本处理它,并在每行后打印。
  • -a根据字段分隔符将输入行拆分为数组F
  • -F,字段分隔符是逗号。
  • -e之后是程序。
  • 程序将默认变量$_设置为数组F中已排序值的逗号连接列表。

Perl处理剩下的事情。

答案 1 :(得分:1)

你需要逐行完成。使用循环:

while read -r line; do
  echo "${line}" | tr ',' '\n' | sort | tr '\n' ','
done < file

(说<file tr ',' '\n'会用逗号替换整个文件中的换行符。)

答案 2 :(得分:1)

你可以避免过多的管道并在GNU awk中进行所有排序:

awk '{split($0, a, ","); n=asort(a);
      for (i=1; i<=n; i++) printf "%s%s", a[i], (i<n)?OFS:RS}' OFS=, file