1行に必要なすべての情報を含む出力を生成するためのコマンド/スクリプトが必要です。

1行に必要なすべての情報を含む出力を生成するためのコマンド/スクリプトが必要です。

bashスクリプト/またはコマンドを使用して次の出力を生成するにはどうすればよいですか?

希望の出力:

contacts.USA | Name:John Due | Gender:Male | Age:21 | Address: Texas    
contacts.USA | Name:Ed Mundo | Gender:Male | Age:41 | Address: California    
contacts.BRAZIL | Name:Tom Paul | Gender:Male | Age:26 | Address: Sau Paulo

入力例:比較する連絡先ファイルが100個あります。国。

連絡先情報。アメリカ

Name:John Due 
Gender:Male 
Age:21
Address: Texas

Name:Ed Mundo 
Gender:Male 
Age:41 
Address: California

連絡先情報。ブラジル

Name:Tom Paul
Gender:Male 
Age:26 
Address: Sau Paulo

以下ではunix cmdを使用していますが、目的の出力を生成することはできません。

grep -E 'Name|Gender|Age|Address' contacts.*

このコマンドの出力には結果が常に表示されます。

contacts.USA Name:John Due 
contacts.USA Gender:Male 
contacts.USA Age:21 
contacts.USA Address: Texas
contacts.USA Name:Ed Mundo 
contacts.USA Gender:Male     
contacts.USA Age:41    
contacts.USA Address: California    
contacts.BRAZIL Name:Tom Paul     
contacts.BRAZIL Gender:Male    
contacts.BRAZIL Age:26    
contacts.BRAZIL Address: Sau Paulo

ベストアンサー1

アッ解決策:

入力ファイルcontacts.USAcontacts.BRAZIL

awk '/Name/{ printf "%s | %s",FILENAME,$0 }
     /Gender|Age|Address/{ printf " | %s",$0; if($0~/Address/) print "" }' contacts.*
  • /Name/{ printf "%s | %s",FILENAME,$0 }-Nameキーワードで行をキャプチャし、FILENAME結果文字列の先頭にファイル名を追加します。

  • if($0~/Address/) print ""-Addressキーワードのある行に会った後、レコード区切り記号(改行)を印刷します。


出力:

contacts.BRAZIL | Name:Tom Paul | Gender:Male  | Age:26  | Address: Sau Paulo
contacts.USA | Name:John Due  | Gender:Male  | Age:21 | Address: Texas
contacts.USA | Name:Ed Mundo  | Gender:Male  | Age:41  | Address: California

おすすめ記事