awk 循环覆盖文件
awk overwriting files in a loop
我正在尝试查看一组文件。 2 年内每个月有 4-5 个文件,其中包含 1000 多个电台。我试图将它们分开,以便每个 station_no (station_no = $1).
有一个文件
我认为这很简单,所以就用了;
awk -F, '{ print > ".txt" }' *.csv
我已经用一个文件进行了测试,它工作正常。但是,当我 运行 它创建 .txt 文件时,但文件中没有任何内容。
我现在尝试将其放入循环中,看看是否可行;
#!/bin/bash
#program to extract stations from orig files
for file in $(ls *.csv)
do
awk -F, '{print > ".txt" }' $file
done
它在循环文件等时工作,但是当它移动到下个月时它会不断覆盖。
如何阻止它覆盖并仅使用该名称添加到 .txt 的末尾?
您说的是 print > file
,它会在每次新呼叫时截断。请改用 >>
,以便它附加到之前的内容。
此外,无需遍历所有文件然后为每个文件调用 awk
。相反,将文件集提供给 awk
,如下所示:
awk -F, '{print >> (".txt")}' *.csv
但是请注意,我们需要稍微谈谈 awk
如何保持文件打开以进行写入。如果你说 awk '{print > "hello.txt"}' file
,awk 将保持 hello.txt
文件打开直到它完成处理。在您当前的方法中,awk
在每个文件上停止;但是,在我目前建议的方法中,文件一直打开,直到处理完最后一个文件。因此,在这种情况下,一个 >
就足够了:
awk -F, '{print > ".txt"}' *.csv
有关 ( file )
的详细信息,请参阅以下 Ed Morton 的评论,我无法解释得比他更好:)
我正在尝试查看一组文件。 2 年内每个月有 4-5 个文件,其中包含 1000 多个电台。我试图将它们分开,以便每个 station_no (station_no = $1).
有一个文件我认为这很简单,所以就用了;
awk -F, '{ print > ".txt" }' *.csv
我已经用一个文件进行了测试,它工作正常。但是,当我 运行 它创建 .txt 文件时,但文件中没有任何内容。
我现在尝试将其放入循环中,看看是否可行;
#!/bin/bash
#program to extract stations from orig files
for file in $(ls *.csv)
do
awk -F, '{print > ".txt" }' $file
done
它在循环文件等时工作,但是当它移动到下个月时它会不断覆盖。
如何阻止它覆盖并仅使用该名称添加到 .txt 的末尾?
您说的是 print > file
,它会在每次新呼叫时截断。请改用 >>
,以便它附加到之前的内容。
此外,无需遍历所有文件然后为每个文件调用 awk
。相反,将文件集提供给 awk
,如下所示:
awk -F, '{print >> (".txt")}' *.csv
但是请注意,我们需要稍微谈谈 awk
如何保持文件打开以进行写入。如果你说 awk '{print > "hello.txt"}' file
,awk 将保持 hello.txt
文件打开直到它完成处理。在您当前的方法中,awk
在每个文件上停止;但是,在我目前建议的方法中,文件一直打开,直到处理完最后一个文件。因此,在这种情况下,一个 >
就足够了:
awk -F, '{print > ".txt"}' *.csv
有关 ( file )
的详细信息,请参阅以下 Ed Morton 的评论,我无法解释得比他更好:)