異なるフィールド数を持つ行のフィールドの結合

異なるフィールド数を持つ行のフィールドの結合

次の入力が与えられました。

x y a b c t
p q w w t
a b c d
p q r

フィールド3のフィールドを最後のフィールドまで連結したいのですが、最後のフィールドを含めないでください。フィールド3が最後のフィールドである場合は、プレースホルダを挿入したいと思います。したがって、上記の入力が与えられると、これが好ましい出力です。

x y a_b_c t
p q w_w t
a b c d
p q _ r

最終結果は、すべての行に4つのフィールドがあることです。 awk、cut、sedなどでこれは可能ですか?

答え1

awk '{
  s = m = ""
  for (i = 3; i < NF; i++) {m = m s $i; s = "_"}
  if (m == "") m = "_"
  print $1, $2, m, $NF}'

答え2

興味深い代替 sed バージョン:

sed -r 's/  */_/g; s/_/ /; s/_/ /  # convert all to _, unconvert 1st 2
        ts;:s; s/(.*)_/\1 / ;t     # if a trailing third exists unconvert it
        s/ / _ /2                  # else add one
'

関連情報