我想用sed操作六个CSV文件
sed -i -e "1d" 1.csv 2.csv 3.csv 4.csv 5.csv 6.csv
或
sed -i -e "1d" *csv
但是当运行任何这些命令时,仅修改1.csv。但是,sed将2-6.csv的原始文件(备份文件的时间戳保持不变)重命名为2.csv-e,依此类推并创建一个新文件2.csv,但这个新文件与2.csv-相同e(和diff:ing 2.csv和2.csv-e没有返回差异)(diffing 1.csv和1.csv-e列出了一些变化)。
如何让sed接受多个文件作为输入?
这是在OS X上。
答案 0 :(得分:3)
格伦的答案是大多数人最好和理想的答案。还有一个 GNU Parallel 的替代方案,看起来更像是您在问题中尝试提出的命令,并且并行运行6份sed
(或您想要的任何其他内容) :
parallel sed -i -e 1d ::: *.csv
要非常小心,因为它可能会非常快速地同时修改很多东西。当你熟悉它时,你应该添加两个标志,即--dry-run
,这样它什么也不做,只显示它会做什么,-k
保持输出顺序。因此,更安全的运行方式如下 - 包括对我们处理的文件更具选择性:
parallel --dry-run -k sed -i -e 1d ::: {1..6}.csv
<强>输出强>
sed -i -e 1d 1.csv
sed -i -e 1d 2.csv
sed -i -e 1d 3.csv
sed -i -e 1d 4.csv
sed -i -e 1d 5.csv
sed -i -e 1d 6.csv
GNU Parallel 最容易安装在带有 homebrew 的macOS上:
brew install parallel
答案 1 :(得分:2)
Sed地址
不需要地址,但如果指定必须是数字(累计计算输入行 跨输入文件),一个美元(``$&#39;&#39;)字符,用于处理最后一行输入或上下文 地址(由一个前缀和后跟分隔符的正则表达式组成)。
所以,你需要一个不同的方法
for file in 1.csv 2.csv 3.csv 4.csv 5.csv 6.csv; do
sed -i -e "1d" "$file"
done
答案 2 :(得分:1)
使用GNU-sed,您可以使用-s:
sed -i.bak -se "1d" {1..6}.csv
({1..6}构造至少在bash中起作用。)
sed的联机帮助页说:
-s, --separate
consider files as separate rather than as a single continuous long stream.
它适用于我,包括就地命令和.bak文件的生成。但我不知道MacOS。首先尝试使用testdata或阅读手册页。