Bash awk在循环中覆盖文件

Bash awk在循环中覆盖文件,bash,awk,overwrite,Bash,Awk,Overwrite,我正试图浏览一组文件。2年内每月有4-5个文件,其中包含1000多个站点。我正在尝试将它们分开,以便每个站点有一个文件(站点号=$1) 我认为这很容易,而且很简单 awk -F, '{ print > $1".txt" }' *.csv 我用一个文件测试过,效果很好。但是,当我运行它时,它会创建.txt文件,但文件中没有任何内容 我现在试着把它放在一个循环中,看看是否有效 #!/bin/bash #program to extract stations from orig files

我正试图浏览一组文件。2年内每月有4-5个文件,其中包含1000多个站点。我正在尝试将它们分开,以便每个站点有一个文件(站点号=$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>文件
,它会在每次新调用时截断。改为使用
>
,以便将其附加到以前的内容中

此外,不需要循环遍历所有文件,然后为每个文件调用
awk
。相反,向
awk
提供一组文件,如下所示:

awk -F, '{print >> ($1".txt")}' *.csv
但是,请注意,我们需要讨论一下
awk
如何保持文件打开以供编写。如果您说
awk'{print>“hello.txt”}文件
,awk将保持
hello.txt
文件打开,直到它完成处理。在您当前的方法中,
awk
在每个文件上停止;然而,在我目前建议的方法中,文件是打开的,直到最后一个文件被处理。因此,在这种情况下,一个
就足够了:

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

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

只需使用
>
来附加,而不是
,这会截断以前的内容。天哪,我知道它会这么简单!非常感谢!我花了半个小时在谷歌上搜索它为什么不起作用:它是一个打字错误。谢谢:)啊,谢谢,我确实试过这么做,但它说我可以“在4分钟内接受答案”,所以我会等待,然后勾选:)
对于*.csv中的文件
要比
对于$(ls*.csv)中的文件
好得多。。。解析
ls
的输出通常被认为是不可取的…但是您确实需要parens
print>>($1.txt”)
以便于移植,并且由于您已经摆脱了循环(对吗?),您不再需要
>
您可以返回到
,即
print>($1.txt”)
。如果不使用gawk,您可能还会发现偶尔需要关闭打开的文件。@EdMorton因此,如果我理解正确:在OP的方法中,当
awk
完成文件处理时,文件会关闭(精神上:当到达
结束时)。因此,在我当前的方法中,这是不必要的,因为所有的文件指针都在最后被释放。唯一的问题是,如果此时打开了这么多文件,对吗?@fedorqui correct and gawk会在内部处理关闭文件的操作,如果打开的文件太多,但使用其他AWK时,您需要手动关闭文件。@EdMorton很棒,总是向您学习。更新,当然可以自由修复任何错误!