1

列を合計して、ファイル名とともに出力を書き込もうとしています。うまく機能し、合計を出力する次の行を書きました。私は2つのことに苦労しています。出力とともにファイル名を渡し、現在のディレクトリをループして *.txt ファイルのみを処理する方法を教えてください。Pls は、Windows 7 でバッチ ファイル (.bat) を使用してこれを実行していることに注意してください。

awk -F"\t" "{ sum+=$2} END {printf ("""%%15d""",sum) >>"output.txt"}" input.TXT 

また、どのように printf ("""%%15d""",sum) の出力を変数に渡すことができますか?

4

3 に答える 3

2

how do i loop through the current directory and process only *.txt filesawkではなく、OSに関する質問です。

各ファイル名は、awk 内の FILENAME 変数に格納されます。

悪夢のような Windows の引用の問題を回避するには、スクリプトをファイル (例: という名前foo.awk) に入れて、そのファイルを実行awk -f foo.awk <input_files><input_files>ます*.txt

投稿したスクリプトに基づいて、foo.awk には以下が含まれます。

BEGIN { FS="\t" }
{ sum[FILENAME] += $2 }
END {
    for (i=1;i<ARGC;i++)
        printf "%s %15d\n", ARGV[i], sum[ARGV[i]] >> "output.txt"
}

しかし、あなたは ">>" を誤用していて、本当に ">" を使いたいと思っています。> "output.txt"入力ファイルと出力ファイルの両方を同じ場所に表示できるように、awk スクリプトを完全に削除して、コマンド ラインで出力をリダイレクトすることもできます。

意味がわかりませんhow can one pass the output of printf ("""%%15d""",sum) to a variable?

sprintf()印刷物のような書式設定を使用し、結果を の代わりに使用する変数に割り当てるには、次のようにしますprintf

$ awk 'BEGIN{ foo = sprintf("%s",3.79); print foo}'
3.79

$ awk 'BEGIN{ foo = sprintf("%d",3.79); print foo}'
3

$ awk 'BEGIN{ foo = sprintf("%.4f",3.79); print foo}'
3.7900
于 2013-09-13T16:26:32.657 に答える