最好通读一次文件,然后将每一行写入文件应该去的地方。所以@steve 使用 AWK 的解决方案是一个很好的解决方案。
grep
您可以使用适当的正则表达式来解决此问题:^.......2010
仅匹配2010
年份位置的行。然后一个shell脚本可以循环多年并继续运行grep
,如下所示:
for year in 2010 2011 2012; do
grep "^.......$year" datafile > $year.txt
done
但它并不优雅,因为它每年读取一次整个源文件。
这是与 AWK 一起使用的 Python 解决方案。
import sys
def next_line():
if len(sys.argv) == 1:
for line in sys.stdin:
yield line
else:
for name in sys.argv[1:]:
with open(name) as f:
for line in f:
yield line
_open_files = {}
def output(fname, line):
if fname not in _open_files:
_open_files[fname] = open(fname, "w")
_open_files[fname].write(line)
for line in next_line():
year = line[7:11]
fname = year + ".txt"
output(fname, line)
AWK 肯定会因为简洁而获胜。我必须实现一个函数next_line()
来提供一个服务,该服务依次提供每个文件的源代码行,或者如果您没有指定文件,则提供标准输入;使用 AWK,您可以免费获得。我必须实现一个函数output()
,让你只提供一个文件名和一个字符串并编写输出,但使用 AWK 你可以免费获得。
如果您的问题不会变得更复杂,您可以使用 AWK 解决方案,但如果您希望随着时间的推移添加更多的花里胡哨,那么 Python 解决方案可能会得到回报。(这就是我喜欢 Python 的原因……一旦你使用它,无论你需要做什么,都很容易扩展它。)