就地排序文件

时间:2016-05-31 21:24:00

标签: linux string shell sorting unix

我想对内容进行排序,并仅使用已排序的数据更新现有文件。

country.csv文件内容为

India,Australia

我使用的命令是

tr , '\n' < country.csv | sort -n | paste -sd, - > country.csv

但是,当我检查时,country.csv为空。

1 个答案:

答案 0 :(得分:1)

这是预期的:管道设置在管道内的程序执行之前发生(大多数情况下 - 它不同步,因此有些情况下execve调用对于管道的早期部分仍然可能发生,而后面部分的重定向尚未完成),因此您的>country.csv会在文件的内容被读取之前擦除它们。

写入不同的输出文件并重命名。

那是:

#!/bin/bash
#      ^^^^- to let us use the below safety feature:
set -o pipefail # bashism: fail the whole pipeline if any component fails

tempfile=$(mktemp country.csv.XXXXXX)
if tr , '\n' <country.csv | sort -n | paste -sd, - >"$tempfile"; then
  mv "$tempfile" country.csv
else
  rm -f "$tempfile"
fi

使用mktemp可以确保多个实例可以同时运行,并且每个实例都有自己的临时文件 - 因此,它们不会对彼此造成伤害。工作 - 并且还传达了对某些安全漏洞(例如符号链接攻击)的抵制。

它确实添加了一个警告,因为mktemp设置限制性文件权限 - 如果您打算将输出文件设置为组或可以访问世界,则可能需要自己更新这些文件。