我在 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
请记住,这可能会更慢。