一意の値を維持し、重複した項目を削除しながら、grep結果を1行に折りたたみますか?

一意の値を維持し、重複した項目を削除しながら、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'

私はusingを見ましたが、tr -d "\n"すべてを1行にまとめます。awkおそらく他の言語がこれに適していると思います。

編集する:

以下は入力ファイルの例ですassessment

パス/01/ターゲット/評価:

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

パス/02/ターゲット/評価:

[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

これは、awkを使用するすべてのUNIXシステムのすべてのシェルで機能します。

$ 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'

関連情報