同じコマンドでファイルを読み書きすることはお勧めできません。私はこれらのステップを分けるだろう。
awkスクリプトがシェルで使用されている場合、出力は一時的に変数に格納できます。 (一時ファイルもオプションです。)
#/bin/bash
for FILE in *.txt; do
# process file
OUTPUT=$(awk '{ printf " %s", $2 + $3 }' "$FILE")
# add results to file
echo "$OUTPUT" >> "$FILE"
done
注:
私は{$2+$3=var}
が意味することを意図しているものをinterpreteことができませんでした。私はそれがvar=$2+$3
であると仮定しました。ここで、var
は結果を表します。
$()
私は$()
を使用して、囲まれたコマンドの標準出力を文字列にリダイレクトし、これを変数に割り当てることができます。 $2
と$3
が誤ってbashの自身によって解釈(したがって、awkスクリプトが間違って作る)することができるよう
awkスクリプトは、(せいぜい単一引用符で)引用符で囲む必要があります。
スペースはデフォルトのフィールドセパレータ–です。それを言及する必要はありません。代わりに、テキストファイルをタブで区切った場合は、それを示す必要があります(例:awk -F"\t"
)。
しかし、完全に間違っている可能性があります。それぞれのrespの合計で列を追加したいかもしれません。ライン。 (あなたがサンプル出力を提供しなかったように、これは私のため不明である。)この場合、awkスクリプトを若干変更する必要があります。
#/bin/bash
for FILE in *.txt; do
# process file
OUTPUT=$(awk '{ print $0" "($2 + $3) }' "$FILE")
# make a backup (or comment next line if you prefer cold showers)
mv "$FILE" "$FILE".bak
# overwrite file with patched version
echo "$OUTPUT" > "$FILE"
done
注:
タブ区切りファイルのコマンドだろう:
最後に awk -F"\t" '{ print $0"\t"($2 + $3) }' "$FILE"
、一般的なノート:
は、元のファイルを変更するには少し危険です。これは、同じファイルセットでbashスクリプト(前者と後者)を繰り返し実行すると、何度も何度もファイルが変更されることを意味しています(意図しない結果が考えられます)。したがって、私はいつも新しい名前のファイルの作成を好みます(例えば、追加の接尾辞付き)。元のファイル名を保持する必要がある場合は、同じ名前の新しいファイルを書き込む前に元のファイルの名前を変更します(たとえば、接尾辞を追加する場合は.bak
)。したがって、意図しない結果は、たとえば次のように簡単に取り消すことができます。
$ for FILE in *.txt.bak; do mv "${FILE}" "${FILE/\.bak/}" ; done
あなたは入力と最終結果を投稿しませんでした。どうして? – RomanPerekhrest
File1.txt 10 20 200 – Adarsh
'var'とは何ですか? – RomanPerekhrest