合并具有相同标题的文本文件

合并具有相同标题的文本文件

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都会重置为零。因此,当我们这样做时,意味着我们只采取行动,并在它是当前文件的第一行时获取该行,并将其内容保存到名为的变量中。FNRFNR==1header

next陈述强制awk立即停止处理当前记录并继续处理下一条记录。这意味着不会对当前记录执行进一步的规则,也不会执行当前规则的其余操作,因此下一次执行时,FNR!=1这将导致awk执行下一个块,即重定向输出(记录/行)到名为(print的文件中,将替换为变量的值;请记住,您需要引用文件名的一部分,它是file########header细绳

我们用了单向>重定向此处。使用此类重定向时,输出文件第一个输出写入之前被擦除。后续写入同一个输出文件不要抹去输出文件,但要附加到它。(这与在 shell 脚本中使用重定向的方式不同。)如果输出文件不存在,则创建。

相关内容