我有一个包含如下记录的 CSV 文件。
id,h1,h2,h3,h4,h5,h6,h7
101,zebra,1,papa,4,dog,3,apple
102,2,yahoo,5,kangaroo,7,ape
我想在没有标题和第一列的情况下将行排序到这个文件中。我的输出应该是这样的。
id,h1,h2,h3,h4,h5,h6,h7
101,1,3,4,apple,dog,papa,zebra
102,2,5,7,ape,kangaroo,yahoo
我在 AWK 下尝试过,但不知道如何排除标题和第一列。
awk -F"," ' {
s=""
for(i=1; i<=NF; i++) { a[i]=$i; }
for(i=1; i<=NF; i++)
{
for(j = i+1; j<=NF; j++)
{
if (a[i] >= a[j])
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for(i=1; i<=NF; i++){ s = s","a[i]; }
print s
}
' file
谢谢
最佳答案
如 perl
没关系:
$ perl -F, -lane 'print join ",", $.==1 ? @F : ($F[0], sort @F[1..$#F])' ip.txt
id,h1,h2,h3,h4,h5,h6,h7
101,1,3,4,apple,dog,papa,zebra
102,2,5,7,ape,kangaroo,yahoo
-F,
表示,
作为输入字段分隔符,结果保存在 @F
大批join ","
使用 ,
作为输出字段分隔符 $.==1 ? @F
对于第一行,按原样打印 ($F[0], sort @F[1..$#F])
对于其他行,获取第一个字段和其他字段的排序输出..
是范围运算符,$#F
将给出最后一个字段的索引 (shift @F, sort @F)
而不是 ($F[0], sort @F[1..$#F])
对于给定的标题,对第一行进行排序也可以,因此这可以简化所需的逻辑
$ # can also use: perl -F, -lane 'print join ",", shift @F, sort @F'
$ perl -F, -lane 'print join ",", $F[0], sort @F[1..$#F]' ip.txt
id,h1,h2,h3,h4,h5,h6,h7
101,1,3,4,apple,dog,papa,zebra
102,2,5,7,ape,kangaroo,yahoo
$ # can also use: ruby -F, -lane 'print [$F.shift, $F.sort] * ","'
$ ruby -F, -lane 'print [$F[0], $F.drop(1).sort] * ","' ip.txt
id,h1,h2,h3,h4,h5,h6,h7
101,1,3,4,apple,dog,papa,zebra
102,2,5,7,ape,kangaroo,yahoo
关于awk - 对没有标题和第一列的csv文件中的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48920626/