awk在循环中覆盖文件

时间:2015-06-05 14:25:18

标签: 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的末尾?

1 个答案:

答案 0 :(得分:4)

您说的是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

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

相关问题