csplit
我能够使用这些日期作为分隔符来拆分包含一堆名称和日期的文本文件。
文件示例:
文件‘xx00’:
1950
Frank
Church
James
McClure
文件‘xx01’:
1945
Zenon
文件‘xx02’:
1950
Bob
我希望合并所有具有相同标题(年份)的文件,并以该年份作为文件名,但不包含标题。因此输出将是:
文件‘1950’:
Frank
Church
James
McClure
Bob
文件“1945”
Zenon
答案1
您可以awk
在这里使用:
awk 'FNR==1{ header=$0;next} {print >"file"header}' filexx*
将生成一个或多个新文件,这些文件的第一行具有相同的标题:
$ cat file1945
Zenon
$ cat file1950
Frank
Church
James
McClure
Bob
解释包括引述awk
文档:
预定义的内置变量FNR
是当前文件中的当前记录号。每次读取新记录时awk
都会递增(请参阅FNR
记录)。每次启动新的输入文件时,awk
都会重置为零。因此,当我们这样做时,意味着我们只采取行动,并在它是当前文件的第一行时获取该行,并将其内容保存到名为的变量中。FNR
FNR==1
header
这next
陈述强制awk
立即停止处理当前记录并继续处理下一条记录。这意味着不会对当前记录执行进一步的规则,也不会执行当前规则的其余操作,因此下一次执行时,FNR!=1
这将导致awk
执行下一个块,即重定向输出(记录/行)到名为(print
的文件中,将替换为变量的值;请记住,您需要引用文件名的一部分,它是file####
####
header
细绳。
我们用了单向>
重定向此处。使用此类重定向时,输出文件第一个输出写入之前被擦除。后续写入同一个输出文件不要抹去输出文件,但要附加到它。(这与在 shell 脚本中使用重定向的方式不同。)如果输出文件不存在,则创建。