awk
ビルトイン変数
サーチ…
FS - フィールドセパレータ
awkが各レコードを複数のフィールドに分割するために使用します:
echo "a-b-c
d-e-f" | awk 'BEGIN {FS="-"} {print $2}'
結果は:
b
e
変数FSは、オプション-Fを使用して設定することもできます。
echo "a-b-c
d-e-f" | awk -F '-' '{print $2}'
デフォルトでは、フィールドは空白(スペースとタブ)で区切られ、複数のスペースとタブは1つのセパレータとしてカウントされます。
RS - レコードセパレータ
入力を複数のレコードに分割するためにawkによって使用されます。例えば:
echo "a b c|d e f" | awk 'BEGIN {RS="|"} {print $0}'
次を生成する:
a b c
d e f
デフォルトでは、レコード区切り文字は改行文字です。
同様に、echo "abc | de f" | awk 'BEGIN {RS = "|"} {print $ 2}'
次を生成する:
b
e
OFS - 出力フィールドセパレータ
awkがprintステートメントによって出力されるフィールドを区切るために使用されます。例えば:
echo "a b c
d e f" | awk 'BEGIN {OFS="-"} {print $2, $3}'
次を生成する:
b-c
e-f
デフォルト値は 、単一のスペースで構成される文字列。
ORS - 出力レコードセパレータ
awkがレコードを区切るために使用し、すべてのprint文の終わりに出力されます。例えば:
echo "a b c
d e f" | awk 'BEGIN {ORS="|"} {print $2, $3}'
次を生成する:
b c|e f
デフォルト値は\n (改行文字)です。
ARGV、ARGC - コマンドライン引数の配列
awkに渡されるコマンドライン引数は、 ARGC要素の内部配列ARGVに格納されます。配列の最初の要素はプログラム名です。例えば:
awk 'BEGIN {
for (i = 0; i < ARGC; ++i) {
printf "ARGV[%d]=\"%s\"\n", i, ARGV[i]
}
}' arg1 arg2 arg3
次を生成する:
ARGV[0]="awk"
ARGV[1]="arg1"
ARGV[2]="arg2"
ARGV[3]="arg3"
FS - フィールドセパレータ
変数FSは、 入力フィールドセパレータを設定するために使用されます 。 awkでは、スペースとタブはデフォルトのフィールドセパレータとして機能します。対応するフィールド値は、 $1 、 $2 、 $3 ...などでアクセスできます。
awk -F'=' '{print $1}' file
-
-F- 入力フィールド区切りを設定するためのコマンドラインオプション。
awk 'BEGIN { FS="=" } { print $1 }' file
OFS - 出力フィールドセパレータ
この変数は、デフォルトでスペースである出力フィールド区切りを設定するために使用されます。
awk -F'=' 'BEGIN { OFS=":" } { print $1 }' file
例:
$ cat file.csv
col1,col2,col3,col4
col1,col2,col3
col1,col2
col1
col1,col2,col3,col4,col5
$ awk -F',' 'BEGIN { OFS="|" } { $1=$1 } 1' file.csv
col1|col2|col3|col4
col1|col2|col3
col1|col2
col1
col1|col2|col3|col4|col5
割り当て$1に$1で$1=$1フィールド(変更$1この場合は)、それは、その結果awk記録再建$0 。レコードを再構築すると、デリミタFSがOFS置き換えられます。
RS - 入力レコードセパレータ
この変数は、入力レコード区切り文字を設定するために使用されます。デフォルトでは改行文字です。
awk 'BEGIN{RS=","} {print $0}' file
ORS - 出力レコードセパレータ
この変数は、出力レコード区切りを設定するために使用されます。デフォルトでは、改行が使用されます。
awk 'BEGIN{ORS=","} {print $0}' file
NF - フィールド数
この変数は、現在の入力レコードのフィールドの総数を返します。
awk -F',' '{print NF}' file.csv
例:
$ cat file.csv
col1,col2,col3,col4
col1,col2,col3
col1,col2
col1
col1,col2,col3,col4,col5
$ awk -F',' '{print NF}' file.csv
4
3
2
1
5
NR - レコードの総数
現在のawkインスタンスで処理されたレコードの総数を提供します。
cat > file1
suicidesquad
harley quinn
joker
deadshot
cat > file2
avengers
ironman
captainamerica
hulk
awk '{print NR}' file1 file2
1
2
3
4
5
6
7
8
この例では、合計8レコードが処理されました。
FNR - ファイル内のレコード数
awkが処理しているファイルに関連して、 awkインスタンスによって処理されたレコードの総数を提供します
cat > file1
suicidesquad
harley quinn
joker
deadshot
cat > file2
avengers
ironman
captainamerica
hulk
awk '{print FNR}' file1 file2
1
2
3
4
1
2
3
4
各ファイルにはそれぞれ4行があるので、 awkがEOF遭遇するたびにFNRは0にリセットされました。
NF - フィールド数
各レコードの列またはフィールドの数を提供します(レコードは各行に対応します)。各行はRSによって区切られ、デフォルトは改行になります。
cat > file1
Harley Quinn Loves Joker
Batman Loves Wonder Woman
Superman is not dead
Why is everything I type four fielded!?
awk '{print NF}' file1
4
4
4
7
FS (どこかにある)は、デフォルトでタブまたはスペースになります。だからハーレー、クイン、ラブ、ジョーカーはそれぞれコラムと見なされます。次の2行は大文字と小文字が区別されますが、最後の行にはスペースが区切られた7つの単語があり、これは7列を意味します。
FNR - 処理中の現在のレコード番号
FNRには、処理中の入力ファイル行の番号が入ります。この例では、2番目のファイルの処理を開始するときにawkが再び1から開始することがわかります。
1つのファイルを持つ例
$ cat file1
AAAA
BBBB
CCCC
$ awk '{ print FNR }' file1
1
2
3
2つのファイルを持つ例
$ cat file1
AAAA
BBBB
CCCC
$ cat file2
WWWW
XXXX
YYYY
ZZZZ
$ awk '{ print FNR, FILENAME, $0 }' file1 file2
1 file1 AAAA
2 file1 BBBB
3 file1 CCCC
1 file2 WWWW
2 file2 XXXX
3 file2 YYYY
4 file2 ZZZZ
2つのファイルを含む拡張サンプル
FNRは、最初のファイルについてのみNR==FNRが真であるため、awkが最初のファイルを処理しているかどうかを検出するために使用できます。たとえば、 FNRファイルfile1とfile2レコードを結合する場合は、次のようになります。
$ awk 'NR==FNR { a[FNR]=$0; next } (FNR in a) { print FNR, a[FNR], $1 }' file1 file2
1 AAAA WWWW
2 BBBB XXXX
3 CCCC YYYY
FNRがfile1とfile2異なる最大値を持ち、異なるFNRに対して結合がないため、 file2レコードZZZZはありません。