1. ホーム
  2. Qt

awk 用の組み込み変数 NF, NR, FNR, FS, OFS, RS, ORS

2022-02-25 13:31:11
<パス

NF フィールド数, (読み込んだ列数)
NR レコード数(行番号)、1から始まり、新しいファイルは上記のカウントを継続、新しいファイルは1から始まらない
FNR 読み込んだファイルのレコード数(行数)、1から始まり、新しいファイルは再び1からカウントを継続します。
FS 入力フィールドの区切り文字、デフォルトはスペース
OFS 出力フィールドのセパレータ、デフォルトはスペース
RS 入力ラインセパレーター、デフォルトは改行
ORS 出力ラインセパレーター、デフォルトは改行

NF

レコードから読み込むフィールド(列)の数、例.

[root@localhost test]# awk '{print "Number of fields: " NF}' test
Number of fields: 4
Number of fields: 4
Number of fields: 3
Number of fields: 4
Number of fields: 4
[root@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5

上記のように、awk はファイルを行ごとに読み込み、組み込み変数 NF に代入された各行のフィールド (列) の数を総数として出力しているのですが、その簡単な例を以下に示します。

[root@localhost test]# awk '{print $NF}' test
1
2
ccc
4
5
t@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5

最後の列だけのデータが必要で、行ごとに列数が異なるため、最後の列は固定列数で指定できないので、NFで列数を表すことができます $NF は、列の総数と同じ数の列のデータを表示することを意味し、それは明らかに最後の列となります。

NR

ファイルから読み込む行数(アプリケーションのシナリオによっては行番号として使用することができる)

[root@localhost test]# awk '{print "line number is: " NR}' test
Line number is: 1
line number: 2
line number: 3
line number: 4
line number: 5
[root@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5

上記のように、ファイルから読み込んだ行数を出力していますが、行単位で読み込んでいるため、アプリケーションシナリオの行番号と等しくすることができ、該当する行の行番号を出力するために使用します NR は、次の簡単な例のように、判定出力として使うこともできる。

[root@localhost test]# awk '{if(NR>2)print "line number is: " NR }' test
Line number is: 3
line number is: 4
line number is: 5

読み込んだ行数(行番号)が2より大きい場合に何を出力するかを決定します。

FNR

もファイルの行数を読み取りますが、これは NR が異なるのは、2つ以上のファイルを読み込む際に NR ファイルを読み込んだ後、行数を増やし続けながら FNR 1から記録を再開する

[root@localhost test]# awk '{print "NR:" NR "FNR:" FNR}' test test2 test3
NR:1FNR:1
NR:2FNR:2
NR:3FNR:3
NR:4FNR:4
NR:5FNR:5
NR:6FNR:1
NR:7FNR:2
NR:8FNR:3
NR:9FNR:1
[root@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5
[root@localhost test]# cat test2
! !!! !!! 1
@ @@ @@@ 2
# ## ### 3
[root@localhost test]# cat test3
bbbbb nnnnn mmmm


上記のように、全部で3つのファイルがあり、3つのファイルを読みます。 NR を最初からずっと増やしていく FNR 新しいファイルを読み込むたびに、行数を1から増やし直し、2つのファイルA、Bの整合性を比較し、Aを基準にして、一致しない場合は行数を出力する面白いアプリケーションです

[root@localhost test]# awk '{if(NR==FNR){arry[NR]=$0}else{if(arry[FNR]! =$0){print FNR}}' test test1
3
[root@localhost test]# cat test
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5
[root@localhost test]# cat test1
a aa aaa 1
b bb bbb 2
c cc ccc 3
d dd ddd 4
e ee eee 5


パースしてください。最初のファイルからAを読み込む場合 NR FNR はともに1からカウントを開始し、その時点で NR==FNR はその行の内容をすべて配列に代入し、2つ目のファイルを読み込んだときに NR!=FNR これは2番目のファイルが読み込まれたことを意味し、内容が$0と異なる場合は行番号が出力されます。

FS

入力フィールドのセパレーターは、デフォルトではスペースで区切られていますが、日常のテキストでは必ずしもスペースで区切られていないことが多いので、セパレーターを指定して入力のフォーマットを整える必要があります。

[root@localhost test]# cat test4
a,b,c
d,e,f
g,h,i
j,k,l
[root@localhost test]# awk '{print $1}' test4
a,b,c
d,e,f
g,h,i
j,k,l
[root@localhost test]# awk 'BEGIN{FS=","}{print $1}' test4
a
d
g
j

上記、test4でのインターレターは "、"。 最初の方法では、FS が指定されていないため、awk はデフォルトでスペースを表示し、内容全体が $1 として表示されます。 2 番目の方法では、FS が指定され "," で、ちゃんと印刷されます。

OFS

読み込まれたデータがスペースで分割されている場合、要求に応じて、出力を "-" スプリットを使用すると、OFSを使用して出力をフォーマットすることができます

[root@localhost test]# awk 'BEGIN{FS=" ";OFS="---"}{print $1,$2,$3}' test
a----aa----aaa
b----bb----bbb
c----cc----ccc
d----dd----ddd
e----ee----eee

RS

入力セクションの行頭を決定する入力ラインセパレータ、デフォルトは改行です。

[root@localhost test]# cat test4
a,b,c
d,e,f
g,h,i
j,k,l
[root@localhost test]# awk 'BEGIN{RS=","}{print}' test4
a
b
c
d
e
f
g
h
i
j
k
l


ここで、RS=","で分割される、行として、つまり、a,bのaは行として扱われ、bも行として扱われますが、慎重に"に見つける;," cとdで分割はありません"," なぜ行として扱わもありますか。", Why is also treated as a line, because the input of c followed by a line break \n only we can't see, input, a line, b line, c \nd a line but the output of the system will \n as a line break, so it seems that c and d is two lines, but actually is an line.

ORS

デフォルトの出力ラインセパレーターは改行で、その仕組みは OFS の機構があり、出力に書式が必要な場合は書式を設定することができる

[root@localhost test]# awk 'BEGIN{ORS=","}{print}' test4
a,b,c,d,e,f,g,h,i,j,k,l,

セパレータはすべて","となり、実際の必要性に応じてさまざまな書式を設定することができる。