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
これで追加の文字が含まれます。