2017-06-15 19 views
-2

ディレクトリから.txtファイルを取得しました。各ファイルを読み込んで列レコードを追加し、同じ.txtファイルに追加します。 awkコマンドを使用してコードを書き込もうとしましたが、エラーがいくつか表示されます。私はそれを解決するのに役立ちます。ありがとう!Bash:ディレクトリから.txtファイルを読み取り、列レコードを追加して同じテキストファイルに追加します。

for file in *. txt; do 
    awk - F' ' {$2+$3=var} >> "$file" 
done 
+0

あなたは入力と最終結果を投稿しませんでした。どうして? – RomanPerekhrest

+0

File1.txt 10 20 200 – Adarsh

+0

'var'とは何ですか? – RomanPerekhrest

答えて

0

同じコマンドでファイルを読み書きすることはお勧めできません。私はこれらのステップを分けるだろう。

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 

注:

  1. 私は{$2+$3=var}が意味することを意図しているものをinterpreteことができませんでした。私はそれがvar=$2+$3であると仮定しました。ここで、varは結果を表します。

  2. $()私は$()を使用して、囲まれたコマンドの標準出力を文字列にリダイレクトし、これを変数に割り当てることができます。 $2$3が誤ってbashの自身によって解釈(したがって、awkスクリプトが間違って作る)することができるよう

  3. awkスクリプトは、(せいぜい単一引用符で)引用符で囲む必要があります。

  4. スペースはデフォルトのフィールドセパレータ–です。それを言及する必要はありません。代わりに、テキストファイルをタブで区切った場合は、それを示す必要があります(例: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 
関連する問題