パイプラインからのgrep出力を行形式から列形式に変換する

パイプラインからのgrep出力を行形式から列形式に変換する

分析を実行するために「dsk」というプログラムを使用しています。私はほんの数行の分析に興味があり、以下を使用してその行を検索します。

dsk -file <filename> | grep -Ei 'string1|string2|string3'

これは私に次のようなものを与えます:

string1                                : 13
string2                                : 46
string3                                : 39

*編集:より現実的な出力のためにフォーマットが変更されました(タブ制限なし、32個のスペース、コロン、フィールド間の別のスペース)。

しかし、私は出力が次のようになりたいと思います。

string1 string2 string3
13      46      39

Glennが提供した答えは、次の結果を生成します。おそらく空白が混乱を引き起こすからです。

string1 string2 string3
:   :   :

答え1

使用変える

dsk -file "$file" | awk '
    tolower($1) ~ /string1|string2|string3/ { n++; vars[n] = $1; vals[n] = $2 }
    END {
        for (i = 1; i <= n; i++) printf "%s\t", vars[i]
        print ""
        for (i = 1; i <= n; i++) printf "%s\t", vals[i]
        print ""
    }
'

答え2

@SteelDriverがリンクした回答に記載されている一般的なツールは、@glenn jackmanの回答と同様に完璧です。

ただし、データ型が指定したように単純な場合、つまりフラグメントにスペースがない場合は、string1 .. stringN入力ファイルを2回読み取るのではなく、次のこともできます。

dsk -file <filename> | grep -Ei 'string1|string2|string3' > tempfile.txt

readarray labels < <(awk '{print $1}' tempfile.txt)
readarray values < <(awk '{print $2}' tempfile.txt)

printf '%s\t' ${labels[@]}
printf '\n'

printf '%s\t' ${values[@]}
printf '\n'

この形式はかなり単純な場合があり、特に必要に応じてアイテムを並べ替えることはできません。しかし、必要なものがタブ区切りの出力だけであれば、そうします。

関連情報