awkのインデントに従って、別の行に文字列を連結します。

awkのインデントに従って、別の行に文字列を連結します。

次のような複数行の文字列があります。

foo
foobar
  bar
  baz
    bat
bar

私は次のように終わりたいと思います:

foo
foobar.bar
foobar.baz
foobar.baz.bat
bar

私の考えは、各行に対して次の行をすべてチェックして、n次の文字列が特定の数の空白で始まることを確認し、空白の数に応じてそれに応じて文字列をフォーマットする必要があることです。

awkを使ってこれを達成できますか?

ベストアンサー1

仮説牛に似た一種の栄養gawk...しかし、エラー訂正は含まれていません(あなたの言葉を信じなさい:「これはテキストファイルです」)...だから、:

$ cat file
foo
foobar
  bar
  baz
    bat
bar
$
$ gawk 'BEGIN {
    PROCINFO["sorted_in"] = "@ind_num_asc"
}

{
    match($0, /^[ \t]*/)
    if (RLENGTH == 0) {
        if (NR > 1 && length(a) == 1) {
            print a[0]
        }
        delete a
        a[0] = $0
        lsnum = RLENGTH
    }
    if (RLENGTH > lsnum) {
        lsnum = RLENGTH
        a[lsnum] = "." substr($0, RLENGTH + 1)
        p = 1
    }
    if (p == 1) {
        for (i in a) {
            printf "%s", a[i]
        }
        print ""
        lsnum = 0
        p = 0
    }
}

END {
    if (length(a) == 1) {
        print a[0]
    }
}' file
foo
foobar.bar
foobar.baz
foobar.baz.bat
bar

ファイルの行の前にスペースまたはタブがある場合はこれが機能します...しかし、2つの組み合わせが混在している場合は、タブをスペースに解析するか、その逆に解析するなど、いくつかの調整が必要になる場合があります。索引付けにより誤った配列要素が設定され、誤った出力が発生します。

おすすめ記事