awkを使用して空行をレコード区切り文字として使用し、改行文字をフィールド区切り文字として使用する方法は?

awkを使用して空行をレコード区切り文字として使用し、改行文字をフィールド区切り文字として使用する方法は?

特定の方法でフォーマットする必要があるファイルがあります。ファイルのレコード様式は次のとおりです。

Record
One

Record
Two

各レコードは空行で区切られ、各フィールドは改行文字で区切られます。次の形式の記録が必要です。

Record:One

Record:Two

これが私が今まで持っているものです。

#!/bin/bash

cat File.txt | awk '{ RS=""; FS="\n"; OFS=":"; ORS="\n" } {print $1,$2 }'

このコードは次の出力を提供します。

:ecord
:one

これは私が探しているものに近いものではありません。これを1行で実行できますか?

答え1

この試み、

awk NF=NF RS="" FS="\n" OFS=":" ORS="\n"  File.txt

Record:One
Record:Two

答え2

パールでは:

perl -l -p -e 'BEGIN {$/="";  $\="\n\n"}; s/\n/:/mg' input 
  • -lPerlのレコード終了自動処理を有効にします。

  • -pwhile ... print各レコードを自動的に読み取り、処理し、印刷するようにスクリプトの周りに暗黙のループを配置します(awkに似ています)。

  • 入力レコード区切り文字($/)を空白に設定すると、$/=""Perlは短絡モード(各レコードを区切る1つ以上の空行)から入力を読み取ります。

  • $\="\n\n"レコードが空行で区切られるように、出力レコード区切り文字を 2 つの改行に設定します。

  • 次に、各レコードのすべての改行を:

これは、各レコードのフィールド数に関係なく機能します。レコードの各行は別々のフィールドです。

出力例:

$ perl -lpe 'BEGIN {$/=""; $\="\n\n"}; s/\n/:/mg' input 
Record:One

Record:Two

注:その後ろに空白行がありますRecord:Two

関連情報