bash - awk 循环覆盖文件

标签 bash awk overwrite

我正在尝试查看一组文件。 2年期间每个月有4-5个文件,其中有1000多个电台。我正在尝试将它们分开,以便每个 station_no 都有一个文件 (station_no = $1)。

我认为这很容易并且简单地进行了;

awk -F, '{ print > $1".txt" }' *.csv

我已经用一个文件进行了测试,效果很好。但是,当我运行它时,它会创建 .txt 文件,但文件中没有任何内容。

我现在尝试将其放入循环中,看看是否有效;

#!/bin/bash
#program to extract stations from orig files

for file in $(ls *.csv)

do 
    awk -F, '{print > $1".txt" }' $file

done

它在循环文件等时工作,但当它移动到下个月时它会不断覆盖。

如何阻止它覆盖并仅添加到具有该名称的 .txt 末尾?

最佳答案

您说的是 print > file,它会在每次新调用时截断。使用 >> 代替,以便它附加到之前的内容。

此外,无需循环遍历所有文件,然后为每个文件调用 awk。相反,将文件集提供给 awk,如下所示:

awk -F, '{print >> ($1".txt")}' *.csv

但是请注意,我们需要讨论一下 awk 如何保持文件打开以进行写入。如果您说 awk '{print > "hello.txt"}' file,awk 将保持 hello.txt 文件打开,直到完成处理。在您当前的方法中,awk 会在每个文件上停止;但是,在我当前建议的方法中,文件会一直打开,直到处理完最后一个文件。因此,在这种情况下,单个 > 就足够了:

awk -F, '{print > $1".txt"}' *.csv

有关(文件)的详细信息,请参阅下面 Ed Morton 的评论,我无法比他更好地解释:)

关于bash - awk 循环覆盖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30669033/

相关文章:

regex - Sed 动态反向引用替换

linux - 允许来自一个 RPM 包的文件被另一个 rpm 包覆盖

bash - awk 处理前两行,然后处理接下来的两行,依此类推

linux - Bash 位置参数命令行排序问题

regex - 使用 sed 或 awk,如何从当前行的末尾匹配回指定的字符?

python - 使用 Python 的 tarfile 时覆盖现有的只读文件

java - 处理-覆盖音频

linux - 搜索字符串,并检索包含该字符串的行及其后面的所有行,直到出现另一个特定模式

bash - 使用打开的终端窗口目录路径在 OSX(Snow Leopard) 中打开一个新的终端选项卡

regex - Bash 使用 awk 从文件中选择有效行