加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

awk – 在没有标题和第一列的csv文件中对行进行排序

发布时间:2020-12-14 02:14:40 所属栏目:Linux 来源:网络整理
导读:我有一个包含如下记录的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,h7 101,apple,zebra 102,ape,yahoo 我尝试了以下AWK,
我有一个包含如下记录的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,h7
  101,apple,zebra
  102,ape,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,h7 
101,zebra
102,yahoo

> -F,表示作为字段分隔符,结果保存在@F数组中

>有关其他选项的详细信息,请参阅https://perldoc.perl.org/perlrun.html#Command-Switches

> join“,”使用,作为输出字段分隔符
> $.== 1? @F代表第一行,按原样打印
>($F [0],排序@F [1 .. $#F])其他行,获取其他字段的第一个字段和排序输出

> ..是范围运算符,$#F将给出最后一个字段的索引

对于给定的标题,排序第一行也会起作用,因此这可以简化所需的逻辑

$perl -F,$F[0],sort @F[1..$#F]' ip.txt
id,yahoo

$ruby -F,-lane 'print [$F[0],$F.drop(1).sort] * ","' ip.txt
id,yahoo

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读