^#$をawkのレコード区切り文字として使用する方法は?


8

awkに#行の中で文字を単独でレコードセパレータとして使用するようにするにはどうすればよいですか 問題は、行の先頭ではなくファイルの先頭に一致するRS="^#$"ため、あなたは言うことができません。また、行の先頭にない文字に一致するため^RS="#\n"機能しません#

$ data='#
first record, first field
first record, second field
#
second record, first field#
second record, second field
'

次に、次のコマンドを使用して、各レコードの最初のフィールドを出力しますRS="#\n"

$ printf "%s" "$data" | awk '
  BEGIN { RS="#\n"; FS="\n" }
  /./ {print $1}
  '
first record, first field
second record, first field
second record, second field

最後の行は最初のフィールドではなく2番目のフィールドなので間違っています。意図された出力は

first record, first field
second record, first field#

1
また、必要な出力の例を提供して
いただけ

あなたのデータは次のようになりline one#line two#line threeますか?
Skaperen 2015年

そしてRS="#"何をしますか?
Skaperen 2015年

@Skaperenいいえ、データは次のように#\nrecord one\n#\nrecord twoなり、各レコードは複数の\n区切られたフィールドで構成されます。
Ernest A

RS='#\n'afaikは動作するはずですが、イニシャル#は空のレコードの終了として扱われます(つまり、すべてのNR値が1つ「オフ」になります)
steeldriver

回答:


6

これを行う1つの方法を次に示しawkます。

$ printf "%s\n" "$data" | 
    awk -F'\n' -v RS='(^|\n)#\n' '/./ {print $1}' 
first record, first field
second record, first field#

トリックにレコードセパレータを設定することであるいずれかのファイル(の開始^)、または続いて改行、#および別の改行\n



1
この場合、NRは1回限りになることに注意してください(で置き換え/./てみてくださいNR==1)。最も簡単な解決策は、ファイル/データを-ではなく-で終了すること#で、別の行にaを付けることだと思います。その後\n#\n、RSとして使用でき、適切に動作します。
don_crissti 2015年

@don_crissti OPからコピーしただけです。私は彼らが空白行を避けるためにそれを使用していると想定しているため、NR==1さらに下に空白行がある場合は機能しません。
terdon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.