例で説明されているファイルに次のファイル(例)を生成するにはどうすればよいですか?
ステータス行(例)の各最後の単語は、前の行の最後の行に追加する必要があります。
例では
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
にスペースを追加し、末尾の改行なしでそのまま印刷します。最初のフィールドと同じ行にstate
2番目のフィールドを印刷します。そして(暗黙) 末尾の改行文字.
答え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
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はHDFS
doです…
。
l=$0;next
var(elle, line) に格納された行をl
次の行に移動します。フィールド1が実行される行
$1=="state"{ … }
の場合... var(elle)とフィールド2に格納されている行を印刷します。古い(以前の)値を印刷しないでください。state
{print(l,$2)}
l
{l=""}
l