已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。
上个月关门了。
Improve this question
我已经看到类似的问题,但似乎没有接近我试图实现的目标。
我有一个动态csv文件(制表符分隔符),每小时更新/追加一次但注意:只有HEADER 1* 和 HEADER 2 下面的行数每小时增加。请看下面两个例子作为参考
第3小时FileA.csv示例**
HEADER 1 NUM
hour 1 5
hour 2 10
hour 3 15
HEADER 2 NUM
hour 1 3
hour 2 6
hour 3 9
HEADER 3 NUM
age 23
bus 21
pig 07
dog 40
文件A.csv示例第7小时
HEADER 1 NUM
hour 1 5
hour 2 10
hour 3 15
hour 4 20
hour 5 25
hour 6 30
hour 7 35
HEADER 2 NUM
hour 1 3
hour 2 6
hour 3 9
hour 4 12
hour 5 15
hour 6 18
hour 7 21
HEADER 3 NUM
age 13
bus 28
pig 85
dog 55
标题1和标题2下面的行每小时增加。标题3及以下是唯一保持不变的
因此,我尝试实现的是简单地将FileA.csv分离为ABC.csv、DEF.csv和GHI.csv
使用第三个小时的例子来参考我试图实现的目标
ABC.csv
HEADER 1 NUM
hour 1 5
hour 2 10
hour 3 15
DEF.csv
HEADER 2 NUM
hour 1 3
hour 2 6
hour 3 9
GHI.csv
HEADER 3 NUM
age 23
bus 21
pig 07
dog 40
下面是我试图使用grep做的事情,但我不能合并grep和cut来实现这一点。我试过使用Sed,但不知道如何切割和移动后搜索。我知道这可以用awk来实现,但在awk中并不强大
1.首先切出HEADER 3和下面的后续行,并将其放入GHI.csv中,因为这将始终是常数,这样我们就剩下HEADER 1和HEADER 2。
1.然后通过搜索Header名称并将其与其下的所有后续行一起剪切掉HEADER 2及以下
1.最后,剩下HEADER 1,我们可以将其留在FileA.csv中,也可以将其移到ABC.csv中
请帮忙,谢谢
3条答案
按热度按时间vfhzx4xs1#
对于任意
awk
和任意数量的文本块:我们只需在每一行以
HEADER
开始时递增变量n
(默认情况下初始化为0),然后打印所有重定向到名为Filen.csv
的文件的行。注意:如果其他行也可以以
HEADER
开头,则可以更具体地说明头部正则表达式(例如,/^HEADER [[:digit:]]+ NUM$/
)。输出文件名为
File1.csv
、File2.csv
、...如果你绝对想要ABC.csv
,DEF.csv
,GHI.csv
,你可以用途:说明:
f
传递。files
中。Filen.csv
,而是重定向到files
数组的条目号n
。请注意,如果你有更多的文本块比列出的文件,你会得到一个错误时,数组索引溢出。
neekobn82#
假设标题字面上有“HEADER ...”行,如所述,请尝试:
顺便说一句,文件正在增长的事实似乎与文件拆分无关。
i7uq4tfw3#
你可以这样写。您不需要awk、sed或grep。Bash本身可以为你做到这一点。
test.sh(示例网站)
让我们运行它
生成文件
ABC.csv
DEF.csv
GHI.csv
说明
我们循环遍历文件的每一行。如果我们看到HEADER 1 NUM,我们说应该将这些行写入ABC. csv。如果行具有HEADER 2 NUM,我们说这些行应该写入DEF,依此类推。
然后我们将这些行写入相应的文件。
例如
>>
表示附加到ABC.csv文件。因此,HEADER 1 NUM被写入该文件如果您希望删除ABC、DEF和GHI文件,可以在脚本中
FILE=FileA.csv
行之前或之后写入rm ABC.csv DEF.csv, GHI.csv
。这样,您总是可以获得全新的文件。