AWK: 他のレコードのフィールドの結合

AWK: 他のレコードのフィールドの結合

一方file:

2018-03-22 foo/bar/baz
2020-09-30 Lorem/ipsum/dolor
2021-10-01 yadda/yadda/yadda
2022-03-14 blah/blah/blah

(実際のファイルにはこのような数千行が含まれています)

文字列を取得する方法2018-03-22_2022-03-14?これは、レコード1のフィールド1、下線、最後のレコードのフィールド1を連結したものです。

私はこれを思い出しました:

$ awk 'BEGIN{ORS="_"}NR==1{print $1} END{print $1}' file | sed 's/_$//'
2018-03-22_2022-03-14

働くが複雑ではないawksedパイプやサブシェルだけを使用したり使用したりすることなく、同じ結果を得る方法です。実際にそのような方法がありますか?

ベストアンサー1

専用バージョンsed:

sed 's/ .*//;1h;$!d;H;g;y/\n/_/' file
  • s/ .*//スペースの後ろのすべての項目を削除し、日付のみを保持するために使用されます。
  • 1h1空白に行の日付をコピーhold
  • $!d d最後の行を除くすべての行を削除
  • ここに到着すると、最後の行にあるため、H最初の日付を含むこの行を前のスペースに追加してから、両方をパターンスペースにコピーします。g
  • 今残っている唯一のことは、挿入された改行(追加のため)を下線に置き換えることです。y/\n/_/

(あなたは少し短いです)

おすすめ記事