输入:
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 代码