将 awk 输出保存到原始文件

将 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

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

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

$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"

顺便说一句,我建议修改您的脚本,以便它从命令行获取两个参数(甚至只是一个参数,新文件名)。这将使测试和调试您的脚本变得容易很多更容易,因为您可以使用 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

相关内容