web-dev-qa-db-ja.com

一意の値を保持し、重複する値を削除しながら、grepの結果を1行に折りたたむ?

私はzshを使用していますが、bashソリューションも利用できます。次のコマンドがあるとします。

ls **/*/assessment(.) | xargs egrep "(^  \[\./.*\]$|^    input = .*$)"

これは私にこれに似た出力を与えます:

<path-01-to>/assessment:  [./input_file_01]
<path-01-to>/assessment:    input = 'input_file_01.i'
<path-02-to>/assessment:  [./input_file_02]
<path-02-to>/assessment:    input = 'input_file_02.i'
<path-02-to>/assessment:  [./input_file_02b]
<path-02-to>/assessment:    input = 'input_file_02b.i'
<path-03-to>/assessment:  [./input_file_03]
<path-03-to>/assessment:    input = 'input_file_03.i'

各([./title]input)ペアが同じ行になるように行を折りたたむ必要があります。したがって、期待される出力は次のようになります。

<path-01-to>/assessment:  [./input_file_01] input = 'input_file_01.i'
<path-02-to>/assessment:  [./input_file_02] input = 'input_file_02.i'
<path-02-to>/assessment:  [./input_file_02b] input = 'input_file_02b.i'
<path-03-to>/assessment:  [./input_file_03] input = 'input_file_03.i'

tr -d "\n"の使用を見てきましたが、すべてが1行にまとめられています。 awkまたは別の言語がこれに適しているのではないかと思います。

編集:

入力ファイルassessmentの例を次に示します。

path/01/to/assessment

[Tests]
  [./input_file_01]
    type = RunApp
    input = 'input_file_01.i'
  [../]
[]

path/02/to/assessment

[Tests]
  [./input_file_02]
    type = RunApp
    input = 'input_file_02.i'
    cli_args = 'blah blah'
  [../]
  [./input_file_02b]
    type = CSVDiff
    input = 'input_file_02b.i'
  [../]
[]
1
dylanjm

これは、すべてのUNIXボックスの任意のシェルで任意のawkを使用して機能します。

$ awk '/^ *\[\.\//{title=$1} /^ *input =/{print FILENAME ":", title, "=", $NF}' */*/assessment
01/to/assessment: [./input_file_01] = 'input_file_01.i'
02/to/assessment: [./input_file_02] = 'input_file_02.i'
02/to/assessment: [./input_file_02b] = 'input_file_02b.i'
2
Ed Morton