Awk コマンドは、レコードの一部のデータを調整するときに同じレコード長を保持します。

Awk コマンドは、レコードの一部のデータを調整するときに同じレコード長を保持します。

*.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

おすすめ記事