ファイルの2行目から2番目のフィールドを1行目に追加します。

ファイルの2行目から2番目のフィールドを1行目に追加します。

例で説明されているファイルに次のファイル(例)を生成するにはどうすればよいですか?

ステータス行(例)の各最後の単語は、前の行の最後の行に追加する必要があります。

例では

HDFS  worker01.gtdns.com
state  STARTED
HDFS  worker02.gtdns.com
state  STOP
HDFS  worker03.gtdns.com
state  STARTED
HDFS  worker05.gtdns.com
state  STARTED
HDFS  worker06.gtdns.com
state  STARTED
HDFS  worker07.gtdns.com
state  STARTED
HDFS  worker08.gtdns.com
state  STARTED
HDFS  worker09.gtdns.com
state  STOP

例(予想結果)

HDFS  worker01.gtdns.com STARTED
HDFS  worker02.gtdns.com STOP
HDFS  worker03.gtdns.com STARTED
HDFS  worker05.gtdns.com STARTED
HDFS  worker06.gtdns.com STARTED
HDFS  worker07.gtdns.com STARTED
HDFS  worker08.gtdns.com STARTED
HDFS  worker09.gtdns.com STOP

答え1

awk '$1 == "HDFS" { printf( "%s ", $0 ) }; $1=="state" { print $2 }' /path/to/input

スクリプトawkは説明がとても簡単です。最初のフィールドがある行から行HDFSにスペースを追加し、末尾の改行なしでそのまま印刷します。最初のフィールドと同じ行にstate2番目のフィールドを印刷します。そして(暗黙) 末尾の改行文字.

答え2

短いGNUAWK方法:

awk -v RS='[[:space:]]+state' '{ printf "%s", $0 }' file
  • -v RS='[[:space:]]+state'-state先行スペースを含む部分文字列を[[:space:]]+入力レコード区切り文字として扱います。RS

出力:

HDFS  worker01.gtdns.com  STARTED
HDFS  worker02.gtdns.com  STOP
HDFS  worker03.gtdns.com  STARTED
HDFS  worker05.gtdns.com  STARTED
HDFS  worker06.gtdns.com  STARTED
HDFS  worker07.gtdns.com  STARTED
HDFS  worker08.gtdns.com  STARTED
HDFS  worker09.gtdns.com  STOP

「2行」静的形式の場合 - 次のことを試すこともできます。SED方法:

sed '/^[[:space:]]*HDFS/{ N; s/[[:space:]]*state // }' file

答え3

使用ex、POSIX指定スクリプト対応ファイルエディタ:

printf '%s\n' 'g/state/s/^ *state *//|-j' x | ex file.txt

このsコマンドは標準の代替コマンドです。-j「前の行()でスペースで区切られた次の行を連結する-接続コマンド()を実行する」という意味です。j

実際j、 oin コマンドは、連結された行の先行スペースを無視し、正規表現が指定されていない場合は前の正規表現が再利用されるため、s次のコマンドは正常に動作し、同じ結果を提供します。

printf '%s\n' 'g/state/s///|-j' x | ex file.txt

これにより、変更がファイルに保存されます。変更を保存せずに表示するには、次のコマンドを代わりに使用します。

printf '%s\n' 'g/state/s///|-j' %p | ex file.txt

答え4

HDFSの後に常に状態があると仮定すると、問題は解決されます。

awk '$1=="HDFS"{l=$0;next};$1=="state"{print(l,$2);l=""}' file

$1=="HDFS"{ … }行の場合、フィールド1はHDFSdoです
l=$0;nextvar(elle, line) に格納された行をl次の行に移動します。フィールド1が実行される行
$1=="state"{ … }の場合... var(elle)とフィールド2に格納されている行を印刷します。古い(以前の)値を印刷しないでください。state
{print(l,$2)}l
{l=""}l

関連情報