モードとファイル処理

モードとファイル処理

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

  • 与えられたパターンで始まる行から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

おすすめ記事