シェルコマンドを使用してファイルから1つ以上の列を削除する方法は?

シェルコマンドを使用してファイルから1つ以上の列を削除する方法は?

入力する:

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_NAMPROCID

答え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コードを実行します。

関連情報