awkが正しいレコード長を表示しないのはなぜですか?

awkが正しいレコード長を表示しないのはなぜですか?

awkレコード長が表示されるのが心配です。特定のレコード長に対していくつかのファイルをチェックしています。 awkは私が望む結果を示していますが、ファイルサイズはファイルの各レコードが実際にawk指定されたものより1バイト大きいことを示しています。

$ ls -l some_file.txt
-rw-r--r--    1 foo   bar           250614 Oct 20 08:49 some_file.txt

$ awk '{ print length }' some_file.txt | sort -u
458

$ echo "(250614%458)" | bc
88

$ echo "(250614%459)" | bc
0

bcレコード長があると結果が間違っていますが、レコード458長がある場合は結果は問題ありません459。またawk、+はsort次のことを示します。みんな録音されたレコード長はです458。私の教育を受けた推測は、これがawk考慮されていないということです行末文字なので、実際のレコード長は459。どう思いますか?

PS:awk点灯AIX 5.3

答え1

あなたが見ているのは完全に正常です。デフォルトでは、awk はレコードに改行文字を含めません。

~からawkのPOSIX規格:

入力は一連のレコードとして解釈する必要があります。デフォルトでは、レコードは終了<newline>を引いた1行です
。 ...
文字列関数
   length[([s])] - 対応する引数を文字列または文字単位の全レコード長として返し、存在しない場合は $0 を返します。パラメータ。

答え2

これは、基本レコード区切り文字がRS改行に設定されているためです。

したがって、awk長さの文字ではなく区切り文字として解釈されます。

RS何が設定されているかを確認するには:

echo | awk '{print "\""RS"\""}'
"
"

表示される値は引用符で区切られますRS

RSこの文字が長さ出力に含まれていないことを確認するには、次のようにします。

$ echo test > some_file.txt
$ ls -l
-rw-r--r--. 1 user user    5 Oct 20 16:33 some_file.txt

改行文字で設定した長さを表示しますRS

$ awk '{print length}' some_file.txt
4

RSファイルに存在しない文字に設定して再計算します。

$ awk 'BEGIN {RS=":"} {print length}' some_file.txt
5

これで追加の文字が含まれます。

関連情報