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
解释:
FNR
是当前输入文件的行号
ctr
是从0开始递增的变量
每次我们看到文件的第一行
ctr
对于第一个输入文件仅为零,因此 !ctr
仅为真
对于第一个文件。
- 没有明确的操作,打印当前输入行。
- 如果
ctr
为假,则第一个条件打印每个文件的第 1 行。
- 如果第二个条件不是文件的第一行,则打印一行。
示范:
$ 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
为零(仅适用于第一个文件的第一行)或该行不是文件的第一行,则打印一行。
我目前正在使用此脚本进行操作:
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
解释:
FNR
是当前输入文件的行号ctr
是从0开始递增的变量 每次我们看到文件的第一行ctr
对于第一个输入文件仅为零,因此!ctr
仅为真 对于第一个文件。- 没有明确的操作,打印当前输入行。
- 如果
ctr
为假,则第一个条件打印每个文件的第 1 行。 - 如果第二个条件不是文件的第一行,则打印一行。
示范:
$ 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
为零(仅适用于第一个文件的第一行)或该行不是文件的第一行,则打印一行。