bashスクリプトでawkを使用して複数行のレコードを処理するにはどうすればよいですか?


13

example.txtは以下です

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

私はbashスクリプトを使用していて、上のファイルから名前でレストランを検索したいと言うことができます。ユーザー名にレストラン名を入力すると、そのレストランに関する情報(5行)が出力されます。

awk '/McDonalds/> /KFC/' example.txt

上記のコード行は、パターン "McDonalds"および "KFC"に一致する行全体を印刷することを知っていますが、テキストファイルの1行目だけを印刷し、そのレストランに関する残りの情報は印刷しません。レストラン名のユーザー入力のみからすべての情報(5行)を印刷するように指示するにはどうすればよいですか?

回答:


11

awkを使用すると、レコードの区切り文字を変更できます。デフォルトでは改行であるため、ファイルの各行はレコードです。RS変数を空の文字列に設定すると、awkはレコードが空白行で区切られていると見なします。

awk -v name="KFC" -v RS="" '$0 ~ "Restaurant: " name' example.txt

あなたの質問がわかりません。かなりあいまいです。得られないのは割り当てですか、それとも使用ですか?
グレンジャックマン

3

を使用してsed

$ sed -n '/KFC/,/^$/p' file
Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

$ sed -n '/McDo/,/^$/p' file
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

説明

これは基本的なsed機能です。SEDの便利な1行のスクリプトを参照できます。

# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p'             # case sensitive

説明を追加します。
BMW

しかし、提案された編集が拒否されたのはなぜですか?私は答えを変えませんでした。書式設定を改善しました。
デイジー

2
$ awk '$2=="KFC" {print; for(i=1; i<=4; i++) { getline; print}}' example.txt

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

上記のコマンドは、forループに送られたため、現在の行とともに連続する4行を取得して印刷し$2=="KFC"ます。検索パターンは、複数の行から特定の行を取得するのに役立ちます。


0

別の可能な解決策:

awk 'BEGIN{FS="\n";RS="\n\n"}{if($1=="KFC")print $0}' example.txt

{if($1=="KFC")print $0}ちょうどに凝縮させることができる$1 == "KFC"真の条件に対するデフォルトアクションは、レコードを印刷することがあるため、。
ムル

0

必要な名前を含む行からwordを含む最後の行まで印刷するだけで十分ですPhone(もちろん、すべてのエントリが同じパターンに従い、常にPhone終了レコードとして保持されるものとします)

$> awk '/5 guys/,/Phone/' restaurants.txt                                     
Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911
$> awk '/McDonalds/,/Phone/' restaurants.txt                                  
Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

少し複雑にしたい場合は、次のように、一致の後に正確に5行を印刷できます。

awk '/McDonalds/{stop=NR+5}; NR<=stop ' restaurants.txt                    

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

stop変数は設定されません、そうNR<=stopなるまで、何かを印刷しない/McDonalds/{stop=NR+5;}部分が実際に変数を設定し、我々は試合を見つけたときにのみ発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.