awk出力をrawファイルに保存する

awk出力をrawファイルに保存する
oldfile=test.csv
read -p "Enter File location: "$savelocation1
read -p "Enter File name: " $newfile1

grep "foobar" $oldfile > $savelocation1/$newfile1

awk ' BEGIN {FS=","}
          { 
              printf "%-5s %-10s" \n, $1, $3
          } ' < $savelocation1/$newfile1

grepは行のみを含む新しいファイルを生成します$newfileが、最初と3番目の列を印刷するためにawkを実行するときの問題は、awkの出力を書かずに結果を端末に印刷することです。"foobar"$oldfile$newfile1$newfile1

編集 - 一時ファイルを使用して保存して出力し、元のファイルに転送します。しかし、何らかの理由で、これはawkステートメントではなくgrepでのみ機能します。

$savelocation1/$oldfile> $savelocation1/tempfile.csv && mv $savelocation1/tempfile.csv $savelocation1/$newfile

答え1

GNU awkを使用している場合:

gawk -i inplace '...' filename      # NOT redirected

moreutilsパッケージをインストールすると

awk '...' filename | sponge filename

一時ファイルを使用する(awkプロセスが正常に完了した場合にのみ元のファイルを上書きします)

t=$(mktemp)
awk '...' filename >"$t" && mv "$t" filename

しかし、ここでは別々のgrepとawkは必要ありません。

awk -F, -v pattern="foobar" '
    $0 ~ pattern {
        printf "%-5s %-10s\n", $1, $3
    }
' $oldfile > $savelocation1/$newfile1

答え2

awkを使用しているので、実際にgrepは必要ありません。

oldfile=test.csv
read -p "Enter File location: " savelocation1
read -p "Enter File name: " newfile1

awk -F, '/foobar/ {printf "%-5s %-10s\n", $1, $3}' "$oldfile" > "$savelocation1/$newfile1"

ただし、コマンドラインで2つの引数(または1つの引数、新しいファイル名)を使用するようにスクリプトを変更することをお勧めします。これにより、スクリプトを簡単にテストしてデバッグできます。たくさんbashの履歴機能を使用すると、毎回再入力しなくても同じディレクトリとファイル名を入力できるため、簡単になります。

例えば

# accept directory and filename from command line args
# very primitive.  use getopts to do this properly.
[ -n "$1" ] && d="$1"
[ -n "$2" ] && f="$2"

# if not provided on the command line, ask for them
[ -z "$d" ] && read -p "Enter output file location: " d
[ -z "$f" ] && read -p "Enter output file name: " f

oldfile=test.csv
awk -F, '/foobar/ {printf "%-5s %-10s\n", $1, $3}' "$oldfile" > "$d/$f"

その後、実行できます。

./myscript.sh somedir somefile.csv

関連情報