awkスクリプトを使用して他のファイルに情報を書き込む

awkスクリプトを使用して他のファイルに情報を書き込む

次の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質問の以前のバージョン)。また、出力ファイルの名前を二重引用符で囲む必要があります。質問の以前のバージョン)。空BEGINENDブロックを完全に削除できます。

Hello N代わりに、ファイル内のすべての行に接頭辞を付けたい場合は、N現在の行番号に対応する整数がどこにありますか(正確にあなたがやりたいことを推測することができ、コードはこの記事の書き込み中に少なくとも一度はそこにありました)。答え;実際にやるべきことを行うためにこれを修正することができます。

{
    printf "Hello %d%s%s\n", NR, OFS, $0 >"hellofile1"

    # or:  print "Hello " NR, $0 >"hellofile1"
}

入力ファイルの各行をファイルに印刷し、hellofile1文字列Hello 、行番号、および出力フィールド区切り文字(デフォルトでは空白)を先頭に付けます。

その結果、出力ファイルはhellofile1切り捨てられますが、ファイルは明示的に閉じられるまで(ここでは発生しません)、またはプログラムが終了するまで書き込み用に開かれているため、プログラムのすべての出力はファイルに正しく印刷されます(以降、呼び出しは開かれたファイルに追加されます)。>awkprint >

これを行う別の方法:

{
    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ドキュメントの例はここにあります。ここ

関連情報