*.txt
タイトルとトレーラーを含むファイルがあります。トレーラーにはいくつかの特定の記録が含まれています。一部のレコードが削除されるファイル操作を実行しているため、トレーラーレコードの数を調整する必要があります。
これを行うコマンドがありますが、数値が大きいものから小さいもの、またはその逆に調整されると、レコード長が変更されます。以下はデータの例です。
HDRFILENAME SOMETHING SOMETHING
H ICOCOM SOME DATA1
H ICOCOM SOME DATA2
H ICOCOM SOME DATA3
H ICOCOM SOME DATA5
H ICOCOM SOME DATA6
H ICOCOM SOME DATA7
H ICOCOM SOME DATA8
H ICOCOM SOME DATA9
TLR11
予告編の録画を調整する必要がありますが、出力は次のとおりです。
1.......10........20........30........40..
HDRFILENAME SOMETHING SOMETHING
H ICOCOM SOME DATA1
H ICOCOM SOME DATA2
H ICOCOM SOME DATA3
H ICOCOM SOME DATA5
H ICOCOM SOME DATA6
H ICOCOM SOME DATA7
H ICOCOM SOME DATA8
H ICOCOM SOME DATA9
TLR9
ファイルレコードの長さは42文字で、トレーラーの数を調整した後も変更せずに保持する必要があります。
トレーラーレコード数を変更するには、次のコマンドを使用します。
{awk '/H ICOC/{cnt++} {sub(/TLR[0-9]+/,"TLR"(cnt+0))} 1' file}
同じレコード長を維持/維持する方法を教えてくれる人はいますか?
$猫-Ev test_mark.txt
HDRFILENAME SOMETHING SOMETHING ^M$
H ICOCOM SOME DATA1 ^M$
H ICOCOM SOME DATA2 ^M$
H ICOCOM SOME DATA3 ^M$
H ICOCOM SOME DATA4 ^M$
H ICOCOM SOME DATA5 ^M$
H ICOCOM SOME DATA6 ^M$
H ICOCOM SOME DATA7 ^M$
H ICOCOM SOME DATA8 ^M$
H ICOCOM SOME DATA9 ^M$
TLR11 ^M$
$
$ awk '/H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1' test_mark.txt |cat-Ev
HDRFILENAME SOMETHING SOMETHING ^M$
H ICOCOM SOME DATA1 ^M$
H ICOCOM SOME DATA2 ^M$
H ICOCOM SOME DATA3 ^M$
H ICOCOM SOME DATA4 ^M$
H ICOCOM SOME DATA5 ^M$
H ICOCOM SOME DATA6 ^M$
H ICOCOM SOME DATA7 ^M$
H ICOCOM SOME DATA8 ^M$
H ICOCOM SOME DATA9 ^M$
TLR9 $
ベストアンサー1
処理後の入力「TLR」ラインの長さが以前と同じになることを望む場合は、次のようになります。
awk '/H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1'
提供された最終的な解決策今、私たちはDOS行の終わりがあり、それを維持したいことを知っています。
awk -v ORS='\r\n' '{sub(/\r$/,"")} /H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1' file