bash 一行一行地合并文本文件,除了第一个文件之外的每个文件中的第一行

bash one liner to combine text files line by line except for the first line in every file except for the first file

我目前正在使用此脚本进行操作:

head -1 file001.txt > all.txt; tail -n +2 -q *.txt >> all.txt

一切正常,从第一个文件中获取 header,然后连接其他文件。

问题是:

其他行都在一行中,而不是每行都在单独的行中。请帮忙解决这个问题。


如果您有任何其他班轮可以完成这项工作,完美,欢迎。

所需的答案将是:

从具有该扩展名的 任何 文件中获取 header,我不想给出任何特定的文件名,例如 file001.txt,我更喜欢它从任何文件中获取它,因为无论如何它们都有相同的 header。但是我的文件名可能不是模式 file001.txt,这就是为什么我说任何具有该扩展名的文件。

试试这个,它可能对你有用:

sed -e '2,${/^YOUR_HEADER/d' -e '}' *.txt > all.txt

使用awk:

awk 'FNR==1&&!ctr++;FNR!=1' *.txt

解释:

  1. FNR是当前输入文件的行号
  2. ctr是从0开始递增的变量 每次我们看到文件的第一行
  3. ctr 对于第一个输入文件仅为零,因此 !ctr 仅为真 对于第一个文件。
  4. 没有明确的操作,打印当前输入行。
  5. 如果 ctr 为假,则第一个条件打印每个文件的第 1 行。
  6. 如果第二个条件不是文件的第一行,则打印一行。

示范:

$ printf '%s\n' hdr f1 f2 > f1.txt
$ printf '%s\n' hdr g1 g2 > f2.txt
$ printf '%s\n' hdr h1 h2 > f3.txt
$ awk 'FNR==1&&!ctr++;FNR!=1' *.txt
hdr
f1
f2
g1
g2
h1
h2

稍微简单一点的命令:

awk '!ctr++ || FNR!=1' *.txt

如果 ctr 为零(仅适用于第一个文件的第一行)或该行不是文件的第一行,则打印一行。