別の列を集計しながら1列を縮小する方法

別の列を集計しながら1列を縮小する方法

次の入力データがあります。

student:xxxxx
student:yyyyy
student:zzzzz
student:kkkkk
student:.
teacher:aaaaa
teacher:bbbbb
teacher:lllll
teacher:.
student:sssss
student:mmmmm
student:.

次のデータを抽出する必要があります。

student:xxxxx yyyyy zzzzz kkkkk.
teacher:aaaaa bbbbb lllll.
student:sssss mmmmm.

sed次の方法でどのようにこれを行うことができますか?awk

答え1

$ cat tst.awk
BEGIN { FS=":" }
{
    if ($2==".") {
        ORS = "\n"
        OFS = ""
        cnt = 0
    }
    else {
        ORS = ""
        OFS = " "
        cnt++
    }
    print (cnt==1 ? $0 : OFS $2)
}

$ awk -f tst.awk file
student:xxxxx yyyyy zzzzz kkkkk.
teacher:aaaaa bbbbb lllll.
student:sssss mmmmm.

それがどのように機能するのかわからない場合は、Arnold Robbinsが書いた本Effective Awkプログラミング、第4版で使用されているすべての構成を研究できます。

答え2

一方sed通行:

/:\./! { s/^.*://; H }
/:\./  { G; s/\n/ /g; s/\. //; s/$/./p; s/.*//; x }

関連情報