【问题标题】:Sort file in-place [duplicate]就地排序文件[重复]
【发布时间】:2016-05-31 21:23:59
【问题描述】:

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

country.csv 文件内容为

India,Australia

我使用的命令是

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

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

【问题讨论】:

  • ...顺便说一句,sort -n?您的示例数据没有任何数字内容。

标签: linux string shell sorting unix


【解决方案1】:

这是意料之中的:管道设置发生在管道内的程序执行之前(大多数情况下——它不是同步的,所以在某些情况下execve 调用了当后面部分的重定向未完成时,管道仍可能发生),因此您的 &gt;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 设置了限制性文件权限 - 如果您希望输出文件是组或全球可访问的,您可能需要自己更新这些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2015-05-28
    • 2010-10-02
    • 2017-09-04
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多