入力する:
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
私の入力ファイルから2つの列の合計を削除したいと思います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コードを実行します。