モードとファイル処理

モードとファイル処理

入力ファイルで次の作業を行う必要があるとします。

  • 与えられたパターンで始まる行からn番目のフィールドを抽出します(例: 「name」パターンで始まる行の 2 番目のフィールド)

  • 対応する各後続行の先頭にフィールドの内容を印刷します。いいえ選択したパターンで開始

  • パターンに一致する新しい行が見つかったら、手順1と2を繰り返します。

私は現在この作業にPythonを使用していますが、awkのようなコマンドラインで軽量で高速なコマンドを使用する方が良いでしょう。

入力サンプル

name    NAME_A
inf     field_A1
name    NAME_B 
inf field_B1
inf field_B2

予想出力:

name    NAME_A
NAME_A  inf field_A1
name    NAME_B 
NAME_B  inf field_B1
NAME_B  inf field_B2

答え1

これは1つのアプローチになります。書式は、指定したフィールド区切り文字によって異なります。FSフィールド区切り記号を使用して定義できますOFS

$ awk -v n=2 '/^name/ {a=$(n); print; next} {print a, $0}' file
name    NAME_A
NAME_A inf  field_A1
name    NAME_B 
NAME_B inf  field_B1
NAME_B inf  field_B2

説明する

  • -v n=2パターンが見つかったときにコピーするフィールド番号を定義します。
  • /^name/ {a=$(n); print; next}行が与えられたパターンで始まる場合、与えられたフィールドを保存して行を印刷します。
  • {print a, $0}それ以外の場合は、最初に保存された値を使用して現在の行を印刷します。

パターン部分を次のように要約できます。

awk -v n=2 -v pat="name" '$1==pat {a=$(n); print; next} {print a, $0}' file

答え2

sed '/^name  */{h;s///;x;n;};G;s/\(.*\)\n\(.*\)/\2        \1/' <<\DATA
name    NAME_A
inf     field_A1
name    NAME_B 
inf field_B1
inf field_B2
DATA

出力

name    NAME_A
NAME_A  inf     field_A1
name    NAME_B 
NAME_B  inf field_B1
NAME_B  inf field_B2

sed hラオ語ごと名前次に、同じパターンから一致するパターンを削除し、印刷する前に予約済みスペースとパターンスペースを交換します。

他のすべての行では、予約済みGスペースをパターンスペースに追加し、改行文字を挿入します。次に、改行文字の両側を変更し、タブに置き換えます。

答え3

これはうまくいくかもしれません:

awk '{print $0 ~ pat ? $0 : p OFS $0   }$0 ~ pat{ p = $NF }' pat='name' file

関連情報