次のような複数行の文字列があります。
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つの組み合わせが混在している場合は、タブをスペースに解析するか、その逆に解析するなど、いくつかの調整が必要になる場合があります。索引付けにより誤った配列要素が設定され、誤った出力が発生します。