将共享相同标头的文件分组,然后将它们连接起来

将共享相同标头的文件分组,然后将它们连接起来

我在 Ubuntu 上使用 Bash,我的问题如下:

.TXT我在某个文件夹中有几十个文件。

据我所知,它们都有一个标题(我相信每个标题都在 1 行上,但不是 100% 确定)。但是,它们不必共享相同的标头。五个文件可能具有相同的标头,而另一个文件可能具有唯一的标头。

最终,我想做的是连接共享相同标头的文件。以下问题的答案(连接具有相同标头的多个文件)解释如何连接具有相同标头的多个文件,但在我的情况下,我首先需要将共享相同标头的文件分组,然后再连接它们(并且仅保留所述组中第一个文件的标头)。

欢迎任何想法:) 谢谢!

答案1

awk '
  FNR==1{
    if (!($0 in h)){file=h[$0]=i++}
    else{file=h[$0];next}
  }
  {print >> (file)}
' *.txt

如果 awk 位于文件的第一行:

  • 如果 header 不存在于 header array 中h,则将数字(最初为零)设置为文件名,并将其放入数组的i++键中。$0
  • 否则(如果标头已在数组中h),从数组中获取文件名并读取下一行。

最后,该行被打印到相应的文件中。


但我收到“太多打开的文件”或类似的信息。

GNU awk 按需处理打开和关闭文件以避免这种情况,但其他 awk 可能不会这样做。在这种情况下,请前往

awk '
  FNR==1{
    if (!($0 in h)||file!=h[$0]){close(file)}
    if (!($0 in h)){file=h[$0]=i++}
    else{file=h[$0];next}
  }
  {print >> (file)}
' *.txt

请记住,这可能会更慢。

相关内容