
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.USA
とcontacts.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
答え2
やや寛容なawkバージョン - "ショートモード"を使用:
$ awk '{$1=FILENAME OFS $1} 1' RS= FS='\n' OFS=' | ' Contacts.*
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
Perlでの同様の実装:
perl -Mfeature=say -F'\n' -00ne 'say join " | ", $ARGV, @F' Contacts.*