特定の方法でフォーマットする必要があるファイルがあります。ファイルのレコード様式は次のとおりです。
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
-l
Perlのレコード終了自動処理を有効にします。-p
while ... print
各レコードを自動的に読み取り、処理し、印刷するようにスクリプトの周りに暗黙のループを配置します(awkに似ています)。入力レコード区切り文字(
$/
)を空白に設定すると、$/=""
Perlは短絡モード(各レコードを区切る1つ以上の空行)から入力を読み取ります。$\="\n\n"
レコードが空行で区切られるように、出力レコード区切り文字を 2 つの改行に設定します。次に、各レコードのすべての改行を
:
。
これは、各レコードのフィールド数に関係なく機能します。レコードの各行は別々のフィールドです。
出力例:
$ perl -lpe 'BEGIN {$/=""; $\="\n\n"}; s/\n/:/mg' input
Record:One
Record:Two
注:その後ろに空白行がありますRecord:Two
。