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

标签 awk sed

我有一个包含如下记录的 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大批
  • https://perldoc.perl.org/perlrun#Command-Switches有关其他选项的详细信息

  • 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/

    相关文章:

    linux - 1 用于获取服务器 IP 地址 (ifconfig) 并将主机名附加到/etc/hosts 以匹配 ipaddress 的内联脚本

    regex - 如何为一个原始模式搜索执行多个就地 SEDS?

    regex - 使用正则表达式查找并替换字符串

    linux - Linux 中的稳定排序

    bash - 从正常运行时间中找出平均负载

    linux - Bash 对 CSV 大文件进行排序并将输出排序到单独的文件

    python - 从日志文件中提取特定的词(不是关键字)

    makefile - 使用 awk 动态设置 makefile 变量

    regex - 使用 sed 搜索精确模式并换行打印

    file - 如果下一行不以数字开头,则删除新行