
次のawkスクリプトがあります。
#!/bin/awk -f
BEGIN{}
{
for(i=1;i<=NF;i++)
sum+=$i; #sum of 3 numbers in a row
printf "Hello %d%s, %s %s, %d\n",NR,OFS, $1,$2,j;j=0
print > "hellofile1"
}
END{}
.awk ファイルに hellofile1 に次のような出力を持たせたい。
1st field 2nd field
Hello 1 ... ...
Hello 2 ... ...
Hello 3 ... ...
ただし、次のように実行すると、awk -f hf.awk hello '>'および '>>'エラーが発生します。 PS printコマンドの外側の$ 1は、helloファイルをパラメータとして参照します。
答え1
ブロックの出力をリダイレクトできませんawk
。質問の以前のバージョン)。また、出力ファイルの名前を二重引用符で囲む必要があります。質問の以前のバージョン)。空BEGIN
でEND
ブロックを完全に削除できます。
Hello N
代わりに、ファイル内のすべての行に接頭辞を付けたい場合は、N
現在の行番号に対応する整数がどこにありますか(正確にあなたがやりたいことを推測することができ、コードはこの記事の書き込み中に少なくとも一度はそこにありました)。答え;実際にやるべきことを行うためにこれを修正することができます。
{
printf "Hello %d%s%s\n", NR, OFS, $0 >"hellofile1"
# or: print "Hello " NR, $0 >"hellofile1"
}
入力ファイルの各行をファイルに印刷し、hellofile1
文字列Hello
、行番号、および出力フィールド区切り文字(デフォルトでは空白)を先頭に付けます。
その結果、出力ファイルはhellofile1
切り捨てられますが、ファイルは明示的に閉じられるまで(ここでは発生しません)、またはプログラムが終了するまで書き込み用に開かれているため、プログラムのすべての出力はファイルに正しく印刷されます(以降、呼び出しは開かれたファイルに追加されます)。>
awk
print >
これを行う別の方法:
{
for (i = NF; i >= 1; --i)
$(i+1) = $i
$1 = sprintf("Hello %d", NR) # or: $1 = "Hello " NR
print >"hellofile1"
}
これにより、既存のフィールドが1つのフィールド「右」に移動し、文字列がレコードHello N
の最初のフィールドとして挿入されます。次に、レコードを出力ファイルに印刷します。これにより、レコードが再形成され、出力内の対応するOFS
フィールドが区別されます(デフォルトでは空白)。
次のように使用できます。
$ awk -f script.awk myfile
その中には、myfile
入力として使用したいいくつかのファイルがあります。
答え2
$1
ブロック内の他のフィールドを使用することは意味がなく、ファイルを読み取る前に実行されるため、フィールドは定義されていませんBEGIN{}
。BEGIN
:
$ echo foo | awk 'BEGIN{print "The first field is:", $1}'
The first field is:
そして空のブロックは意味がありませんEND{}
。つまり、あなたが望むものはこれがすべてだと思います。
awk '{print "Hello",NR,$0 > "outFile"}' inFile
または他のオプション:
awk '{print "Hello",NR,$0}' inFile > outFile
次のファイルに対して上記のコマンドを実行する場合:
$ cat file
field1 field2
field1 field2
field1 field2
field1 field2
field1 field2
あなたは得るでしょう:
$ awk '{print "Hello",NR,$0 > "outFile"}' file
$ cat outFile
Hello 1 field1 field2
Hello 2 field1 field2
Hello 3 field1 field2
Hello 4 field1 field2
Hello 5 field1 field2
awkスクリプトでは、次のようになります。
#!/bin/awk -f
{
print "Hello",NR,$0 > "outFile"
}
答え3
1、>そして>>bashの概念ですが、スクリプトのソルバーは/ bin / awkです(スクリプトの最初の行に従って)。 IMHO、bashスクリプト内でawkスクリプトを呼び出すか、HEREDOCを使用してすべてを同じファイルに入れることができます。
アップデート:bash / awkドキュメントの例はここにあります。ここ