入力ファイルで次の作業を行う必要があるとします。
与えられたパターンで始まる行から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