awk 用の組み込み変数 NF, NR, FNR, FS, OFS, RS, ORS
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,
セパレータはすべて","となり、実際の必要性に応じてさまざまな書式を設定することができる。
関連
-
linux シェルスクリプト実行エラー:不正な置換
-
Ubuntu で vs code のソースファイル "iostream" を開けない。
-
ERR_CONTENT_LENGTH_MISMATCH 問題解決のためのハンドブック
-
ソリューションが不完全なタイプである
-
エラー: 'for' ループの初期宣言は C99 モードでのみ許可されます。
-
linux環境:警告。ISO C++は文字列定数を'char*'に変換することを禁じている[-Write-strings]。
-
Makefile 実行中のエラー: make: *** xxx が必要とするターゲット ` ' を作成するためのルールがありません。
-
CentOS 7のインストールとDockerの展開
-
jmeterツールです。JMETER_HOME 環境変数が定義されていない 問題解決
-
要求された URL * はこのサーバーで見つかりませんでした。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー解決:bash: nvm: コマンドが見つかりません。
-
ubuntu installationEnvironmentError: mysql_config not found エラー
-
SocketExceptionです。ブロークン・パイプ・エラーの可能性
-
kill はプロセスを終了させることができません
-
makeの問題解決。*** ターゲットが指定されておらず、makefileも見つかりません。
-
を作ってください。*** ターゲットが指定されておらず、makefileも見つかりませんでした。
-
linuxのセグメンテーション障害
-
テキストファイルのビジー状態解消
-
コンパイル時の警告をなくす(Warning)
-
ansibleのitemsとwith_itemsを理解する