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

Nai*_*ita 25 shell sed awk shell-script text-processing

输入:

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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

我要删除的两列INFO_NAM,并PROCID从我的输入文件。

mtk*_*mtk 40

不要打印6列和8列

awk '{$6=$8=""; print $0}' file
Run Code Online (Sandbox Code Playgroud)

  • 当分隔符不是空格时,这不起作用;它使字段的内容成为空字符串,但不会完全删除该字段。参见 `echo "a|b|c|d|e" | awk -v FS='|' -v OFS='|' '{$2=$4=""; print}'` 产生 `a||c||e` (2认同)

小智 25

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

我相信这awk是最好的。

awk '{print $1,$2,$3,$4,$5,$7}' file
Run Code Online (Sandbox Code Playgroud)

也可以使用cut

cut -f1,2,3,4,5,7 file
Run Code Online (Sandbox Code Playgroud)

  • 顺便提一下:`cut` 的`--complement` 选项在这里可能很方便,即删除两个字段而不是选择六个:`cut -f6,8 --complement file` (8认同)
  • 给`cut`一个例子,还是不提? (4认同)

enh*_*nic 6

删除列的最佳方法是使用cut

cut --complement -d' ' -f6,8 file
Run Code Online (Sandbox Code Playgroud)

解释:

  • -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
Run Code Online (Sandbox Code Playgroud)

如果将其集成到变量可能会更改的脚本中,您可以执行以下操作:

infile=myfile.txt
outfile=myfile_parsed.txt
deletecols=4-7 #using hyphen to specify a range
delimiter=' '
cut -d "$delimiter" -f "$deletecols" $infile > $outfile
Run Code Online (Sandbox Code Playgroud)

  • MacOS 又名 BSD 似乎没有 `--compliment` (2认同)