我对linux很新,觉得这应该是一个相当简单的任务,但我无法弄明白。我有一个包含数百万行的大型数据文件,我想根据日期将文件分成较小的文件。我有一个包含YYMMDDHH数据的时间列,我想基于DD创建子文件。对于每个新的DD,我想要创建一个包含当天所有条目的新文件。该文件是一个csv,已按时间排序。
从我所看到的内容看起来我应该能够使用cat,awk和grep来执行我想要的。
进一步详细说明,每行有14列。一列包含YYMMDDHH的数据(即14071000,14071000 ... 14071022,14071022 ...... 14071100 ... 14071200 ...)
我可以手动用
进行子集cat trial | awk 'NR>=1 && NR<=100 {print}' >output.txt
这给了我1到100之间的行。我想知道是否有一个允许我根据YYMMDDHH列提取的命令,以便140710上的所有数据点都可以放在一个文件中。希望这有助于更好地解释我的问题。
答案 0 :(得分:0)
你应该可以使用s.th.像这样:
awk '{ line_date = $1 / 100; print > "out_" line_date ".txt"; }'
顺便说一句,您可能希望避免“无用地使用猫”,而不是直接在您的文件上使用awk。
答案 1 :(得分:0)
想象YYMMDDHH是第一名。
awk '{fn = substr($1, 1, 6) ; print $0 >> fn }' 1.txt
答案 2 :(得分:0)
awk '{print $0 >> "File" substr($1, 0, 6) ".txt"}' file
假设日期在第一列。逻辑是将每一行附加到相应的文件(文件名是YYMMDD格式的日期)。这样每个日期对应的所有数据都将在相应的&#34; FileYYMMDD.txt&#34;中。如果日期在某个其他列中,您只需将$ 1更改为列号。
示例输出:
sdlcb@Goofy-Gen:~/AMD/SO$ cat file
14071000 asasaa
14071022 iosido
14071000 lsdksld
14071022 sodisdois
14071100 iwiwe
14071022 iosido
14071100 iwiwe
14071200 yqiwyq
sdlcb@Goofy-Gen:~/AMD/SO$ awk '{print $0 >> "File" substr($1, 0, 6) ".txt"}' file
sdlcb@Goofy-Gen:~/AMD/SO$ ls
file File140710.txt File140711.txt File140712.txt
sdlcb@Goofy-Gen:~/AMD/SO$ cat File140710.txt
14071000 asasaa
14071022 iosido
14071000 lsdksld
14071022 sodisdois
14071022 iosido
sdlcb@Goofy-Gen:~/AMD/SO$ cat File140711.txt
14071100 iwiwe
14071100 iwiwe
sdlcb@Goofy-Gen:~/AMD/SO$ cat File140712.txt
14071200 yqiwyq