在linux上使用awk或从命令行删除文件中的列

在linux上使用awk或从命令行删除文件中的列,awk,Awk,如何使用awk从选项卡分隔的字段文件中删除某些列 c1 c2 c3 ..... c60 例如,删除3到29之间的列。您可以在所有列上循环,并过滤掉不需要的列: awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt 这有两种改进方式: 保留原始的分隔符 不在末尾附加分隔符 这就是cut命令的作用: cut -f1,2,30- inputfile 默认值是tab。您可以

如何使用
awk
从选项卡分隔的字段文件中删除某些列

c1 c2 c3 ..... c60

例如,删除3到29之间的列。

您可以在所有列上循环,并过滤掉不需要的列:

awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt
这有两种改进方式:

  • 保留原始的分隔符
  • 不在末尾附加分隔符

    • 这就是
      cut
      命令的作用:

      cut -f1,2,30- inputfile
      
      默认值是tab。您可以使用
      -d
      开关更改此设置

      awk '{for(z=3;z<=15;z++)$z="";$0=$0;$1=$1}1'
      
      输出

      c1 c2 c16 c17 c18 c19 c20 c21
      

      不添加前导或尾随空格的Perl“splice”解决方案:

      perl -lane 'splice @F,3,27; print join " ",@F' file
      
      产生输出:

      c1 c2 c30 c31
      

      这个关于stackoverflow的答案可能会帮助您:您不应该打印一个选项卡(\t)而不是一个空格吗。他想删除字段,也许不想同时删除制表符(如果我没听错的话)。@johnny:你说得对。我更新了代码,所以它应该正确地考虑分隔符。让我们假设您编辑的答案,我们想删除列号2,5,7,8,23,45,67 2545 54 48 8。这样做的条件是什么?我有一个包含近4000列的文件@oliverI不得不删除最后一个
      -
      ,以使其在Ubuntu中工作。如果我离开它,
      cut
      将打印所有列。有人也有这个问题吗?它应该将第1、2和30列打印到最后一列(问题中的60列)。如果没有,那就是Ubuntu中的一个bug!啊,好的。我犯了一个错误。我的不好。如何删除特定列,例如第3列?@becko有一个通用扩展名,
      --complete
      ,它对输入字段号执行它所说的操作,例如:
      cut--complete-f3
      。这不会删除列。它会将它们清空并重新打印。。。用指定的
      O*FS
      of
      \t
      替换OP的
      O*FS
      为一个单独的空格,他们没有要求。明显的删除是巧合的,需要将
      FS
      OFS
      作为默认的
      \s+
      。一个非常无用的分隔符,与OP的
      \t
      不兼容,除非他们的文件碰巧不能有空字段,因为它会将它们挤压成参差不齐的行。任何其他分隔符,例如OP的
      \t
      ,都会给出仍然包含不需要的列但现在为空的输出。而
      $0=$0
      是多余的,可能是浪费。重建记录的文档化方法是
      $1=$1
      perl -lane 'splice @F,3,27; print join " ",@F' file
      
      c1 c2 c30 c31