将 awk 输出保存到原始文件

Use*_*r10 0 grep awk

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
Run Code Online (Sandbox Code Playgroud)

grep 将创建一个名为的新文件$newfile,该文件仅包含"foobar"来自的行,$oldfile但是当我执行 awk 以将第一列和第三列打印到$newfile1问题中时,问题在于它没有将 awk 的输出写入 ,$newfile1但它只是将结果打印到终端。

编辑 - 我使用一个临时文件来存储然后输出然后将其传输到原始文件。但是,由于某种原因,这只适用于 grep 而不适用于任何 awk 语句。

$savelocation1/$oldfile> $savelocation1/tempfile.csv && mv $savelocation1/tempfile.csv $savelocation1/$newfile
Run Code Online (Sandbox Code Playgroud)

gle*_*man 5

如果您使用 GNU awk:

gawk -i inplace '...' filename      # NOT redirected
Run Code Online (Sandbox Code Playgroud)

如果安装moreutils

awk '...' filename | sponge filename
Run Code Online (Sandbox Code Playgroud)

使用临时文件(如果 awk 进程成功完成,则仅覆盖原始文件)

t=$(mktemp)
awk '...' filename >"$t" && mv "$t" filename
Run Code Online (Sandbox Code Playgroud)

但是,这里不需要单独的 grep 和 awk:

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

Run Code Online (Sandbox Code Playgroud)