移植可能な方法でファイル間AWKのRS変数を変更する方法

移植可能な方法でファイル間AWKのRS変数を変更する方法

他の質問を見ながら、awkプログラムに2つのファイルが必要な場合(つまり、比較のために最初のファイルの項目を配列に読み込む場合(通常はこのような場合))、awkは通常解決できない問題を発見しました。ファイル間のRS変更を処理する方法は?

次のファイルが提供されます。

~$> cat awktest1.txt 
111 112 113 114|121 122 123 124|131 132 133 134|141 142 143 144
 ~$> cat awktest2.txt 
211 212 213 214

221 222 223 224

231 232 233 234

241 242 243 244

基本的な例として、次のコマンドを実行するには、次のようにします。

#! /usr/bin/awk -f

# awktest.awk file1 file2
# cant swap RS between files

BEGIN { RS="|" }

NR>ONR && ONR==1 { RS="" }
{ print $1 "." $2 "." $3 "." $4 }

# will work with with, but this is GNU only.
# ENDFILE { RS="" }
END { print "\nfinal $0: \n" $0 }

その後、RS2番目のファイルの最初のレコードを読み取った後に変更が発生するため、この(人為的な例)では、出力は次のようになります。

~$>./awktest.awk awktest1.txt awktest2.txt 
111.112.113.114
121.122.123.124
131.132.133.134
141.142.143.144
211.212.213.214

final $0:
211 212 213 214

221 222 223 224

231 232 233 234

241 242 243 244

2番目のファイルのすべての内容は、4ではなく単一のレコードとして読み込まれます。明らかに、この例ではawk以前の問題を解決するのは簡単でしたが、実際にawkにどのような方法がありますか?

ベストアンサー1

ファイル名や割り当てなどのパラメーターを混在させることができるので、以下を実行できます。

awk '{ print $1 "." $2 "." $3 "." $4 }' RS='|' file1 RS='' file2

各ファイルに異なる値を設定できるようにawk順番に処理します。RS


awkこの文字を含むファイル名は=
問題を解決する方法は次のとおりです。

おすすめ記事