我有一个包含许多行的文件,每行包含一个以逗号分隔的列表。我想对每一行进行排序。
如果我有一行,那就很容易:
<file tr ',' '\n' | sort | tr '\n' ','
但是如果我在我的文件上这样做,它会将我不想要的所有行集中在一起。我如何限制这个?
答案 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