Awk 使用bash对文件进行排序,将头保留为第一个位置

Awk 使用bash对文件进行排序,将头保留为第一个位置,awk,sed,Awk,Sed,对文件进行排序时,我不会将标题保留在其位置: 文件1.tsv Gene Number a 3 u 7 b 9 结果: a 3 b 9 Gene Number u 7 所以我在尝试这个代码: sed '1d' file_1.tsv | sort -k1,1 > file_1_sorted.tsv first='head -1 file_1.tsv' sed '1 "$first"' file_1_sorted.t

对文件进行排序时,我不会将标题保留在其位置:

文件1.tsv

Gene   Number  
a       3
u       7
b       9
结果:

a     3
b     9
Gene  Number
u     7

所以我在尝试这个代码:

sed '1d' file_1.tsv | sort -k1,1 > file_1_sorted.tsv 
first='head -1 file_1.tsv' 
sed '1 "$first"' file_1_sorted.tsv

我所做的是删除头并对文件的其余部分进行排序,然后再次尝试添加头。但我无法执行最后一部分,因此我想知道如何复制原始文件的标题并将其作为新文件的第一行插入,而不替换其实际第一行。

请尝试以下操作

awk '
FNR==1{
  first=$0
  next
}
{
  val=(val?val ORS:"")$0
}
END{
  print first
  print val | "sort"
}
'  Input_file
逻辑解释:

  • 检查条件
    FNR==1
    ,查看其第一行是否正确;然后将其值保存到变量,并通过
    next
    移动到下一行
  • 然后继续将所有行的值附加到另一个具有新行的变量,直到最后一行
  • 现在转到该代码的
    END
    块,该块在读取完输入文件后执行,打印第一行值,并将
    sort
    命令放在其余行值上

    • 请您尝试以下内容

      awk '
      FNR==1{
        first=$0
        next
      }
      {
        val=(val?val ORS:"")$0
      }
      END{
        print first
        print val | "sort"
      }
      '  Input_file
      
      逻辑解释:

      • 检查条件
        FNR==1
        ,查看其第一行是否正确;然后将其值保存到变量,并通过
        next
        移动到下一行
      • 然后继续将所有行的值附加到另一个具有新行的变量,直到最后一行
      • 现在转到该代码的
        END
        块,该块在读取完输入文件后执行,打印第一行值,并将
        sort
        命令放在其余行值上
      输出:

      Gene   Number  
      a       3
      b       9
      u       7
      
      输出:

      Gene   Number  
      a       3
      b       9
      u       7
      

      您也可以这样做:

      { head -1; sort; } < file_1.tsv
      
      {head-1;sort;}
      **更新**

      对于macos:

      { IFS= read -r header; printf '%s\n' "$header" ; sort; } < file_1.tsv
      
      {IFS=read-r头;printf'%s\n'$header'排序;}
      您也可以这样做:

      { head -1; sort; } < file_1.tsv
      
      {head-1;sort;}
      **更新**

      对于macos:

      { IFS= read -r header; printf '%s\n' "$header" ; sort; } < file_1.tsv
      
      {IFS=read-r头;printf'%s\n'$header'排序;}
      更简单的
      awk

      $ awk 'NR==1{print; next} {print | "sort"}' file
      

      更简单的
      awk

      $ awk 'NR==1{print; next} {print | "sort"}' file
      

      这将在每个UNIX框上使用任何awk、排序和剪切任何shell,并且无论输入是来自管道(当您无法读取它两次时)还是来自文件(当您可以读取时),都将起作用,并且不涉及awk生成子shell:

      awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
      
      上面使用awk将0粘贴在标题行的前面,将1粘贴在其余字段的前面,这样您就可以按该数字排序,然后再按任何其他要排序的字段排序,然后再次使用剪切删除添加的字段。这是分阶段的:

      $ awk -v OFS='\t' '{print (NR>1), $0}' file
      0   Gene   Number
      1   a       3
      1   u       7
      1   b       9
      
      $ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2
      0   Gene   Number
      1   a       3
      1   b       9
      1   u       7
      
      $ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
      Gene   Number
      a       3
      b       9
      u       7
      

      这将在每个UNIX框上使用任何awk、排序和剪切任何shell,并且无论输入是来自管道(当您无法读取它两次时)还是来自文件(当您可以读取时),都将起作用,并且不涉及awk生成子shell:

      awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
      
      上面使用awk将0粘贴在标题行的前面,将1粘贴在其余字段的前面,这样您就可以按该数字排序,然后再按任何其他要排序的字段排序,然后再次使用剪切删除添加的字段。这是分阶段的:

      $ awk -v OFS='\t' '{print (NR>1), $0}' file
      0   Gene   Number
      1   a       3
      1   u       7
      1   b       9
      
      $ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2
      0   Gene   Number
      1   a       3
      1   b       9
      1   u       7
      
      $ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
      Gene   Number
      a       3
      b       9
      u       7
      

      这对我不起作用。它只打印第一行,没有对其余行进行排序。>GNU bash,5.0.16(1)版-发布(x86_64-apple-darwin17.7.0)对文件进行排序可能
      sed-i-e'e(head-1;sort)@EricBolinger,
      head--version
      给出了
      head(GNU coreutils)8.30
      ,也许macos上的
      head
      已经占据了所有行。谢谢Philippe。实际上,这个
      可执行文件是从FreeBSD移植到Mac OS X的。它不理解
      --version
      选项。但是在二进制文件上运行
      strings
      会产生:
      $FreeBSD:src/usr.bin/head/head.c,v1.20 2007/01/11 20:23:01 brooks Exp$
      ,看起来像是CVS注入的记录。这对我来说不起作用。它只打印第一行,没有对其余行进行排序。>GNU bash,5.0.16(1)版-发布(x86_64-apple-darwin17.7.0)对文件进行排序可能
      sed-i-e'e(head-1;sort)@EricBolinger,
      head--version
      给出了
      head(GNU coreutils)8.30
      ,也许macos上的
      head
      已经占据了所有行。谢谢Philippe。实际上,这个
      可执行文件是从FreeBSD移植到Mac OS X的。它不理解
      --version
      选项。但是在二进制文件上运行
      strings
      会产生:
      $FreeBSD:src/usr.bin/head/head.c,v1.20 2007/01/11 20:23:01 brooks Exp$
      ,看起来像是一个CVS注入的记录。