如何使用 shell 命令从文件中删除一列或多列?

如何使用 shell 命令从文件中删除一列或多列?

输入:

ARCHIVE  B1_NAME  B2_NAME  B3_NAME  ELEMENT  INFO_NAM WERT PROCID
-------- -------- -------- -------- -------- -------- ---- ------
15MinAvg AIRSS    33-GIS   DMDMGIS1 I        MvAvr15m 1123  CP
15MinAvg AIRSS    33-GIS   DMDMGIS1 P        MvAvr15m 2344  CP
15MinAvg AIRSS    33-GIS   DMDMGIS1 Q        MvAvr15m 4545  CP
15MinAvg AIRSS    33-GIS   DMDMGIS2 I        MvAvr15m 6576  CP
15MinAvg AIRSS    33-GIS   DMDMGIS2 P        MvAvr15m 4355  CP
15MinAvg AIRSS    33-GIS   DMDMGIS2 Q        MvAvr15m 6664  CP

输出:

ARCHIVE  B1_NAME  B2_NAME  B3_NAME  ELEMENT WERT
-------- -------- -------- -------- ------- ----
15MinAvg AIRSS    33-GIS   DMDMGIS1 I       1123
15MinAvg AIRSS    33-GIS   DMDMGIS1 P       2344
15MinAvg AIRSS    33-GIS   DMDMGIS1 Q       4545
15MinAvg AIRSS    33-GIS   DMDMGIS2 I       6576
15MinAvg AIRSS    33-GIS   DMDMGIS2 P       4355
15MinAvg AIRSS    33-GIS   DMDMGIS2 Q       6664

我想从我的输入文件中删除两列INFO_NAM和。PROCID

答案1

如果您愿意清除列而不是完全删除它们:

不打印6和第8

awk '{$6=$8=""; print $0}' file

答案2

这个问题之前已经在 Stack Overflow 上的其他地方得到了回答:

我相信awk这是最好的。

awk '{print $1,$2,$3,$4,$5,$7}' file

cut也可以使用。

cut -f1,2,3,4,5,7 file

答案3

删除列的最佳方法是cut

cut --complement -d' ' -f6,8 file

解释:

  • -d指定分隔符;在这种情况下,一个空格
  • --complement保留除指定的列之外的列-f
  • -f指定要剪切的列(而不是要保留的列,因为--complement正在使用);在本例中,第 6 列和第 8 列

来自剪切手册页:

  -d, --delimiter=DELIM
        use DELIM instead of TAB for field delimiter

  -f, --fields=LIST
         select only these fields;  also print any line that contains
         no delimiter character, unless the -s option is specified

  --complement
         complement the set of selected bytes, characters or fields

其他一些人建议使用类似 的结构awk '{$2=$4=""; print $0}',但这在分隔符不是空格的情况下不起作用;它使字段的内容成为空字符串,但不会完全删除该字段。例如,echo "a|b|c|d|e" | awk -v FS='|' -v OFS='|' '{$2=$4=""; print}'产量a||c||e

答案4

如果您愿意接受 Perl 解决方案......

perl -ane 'printf("%-8s %-8s %-8s %-8s %-8s %-4s\n", $F[0], $F[1], $F[2], $F[3], $F[4], $F[6])' file

使用这些命令行选项:

  • -n循环输入文件的每一行,不自动打印每一行

  • -a自动分割模式 – 将输入行分割到 @F 数组中。默认按空格分割

  • -e执行以下 perl 代码

相关内容