我想将多个文件合并为单个文件,并删除除第一个文件页眉和最后一个文件页脚之外的所有文件的页眉和页脚。
例如我有10个文件:
文件1
Name
A
B
C
Next date
文件2
Name
D
E
F
Next date
...
文件10
Name
X
Y
Next date
我需要像这样的输出:
Name
A
B
C
D
E
F
...
X
Y
Next date
指挥下怎么做sed
?
答案1
使用head
,tail
和sed
:
set -- File*
{
head -n 1 "$1"
for file do
sed '1d;$d' "$file"
done
tail -n 1 "$file"
} >outfile
这假设所有相关文件的名称都匹配File*
(或您在命令中用于匹配它们的任何模式set
)。
该set
命令将位置参数(即 等)设置$1
为$2
我们想要使用的文件名。这些也可以在列表中找到$@
。
该head
命令首先从第一个文件中提取标头。
循环中的以下sed
命令(迭代 匹配的所有文件File*
)然后输出每个文件的内容,每个文件的第一行和最后一行除外。该sed
表达式1d
删除输入的第一行,并$d
删除最后一行。
最终tail
输出最后一个文件的页脚。
所有输出都重定向到名为outfile
.
使用四个文件进行测试,每个文件都有单行页眉和页脚:
$ cat File*
FIRST HEADER
1
2
3
FOOTER
HEADER
1
2
3
FOOTER
HEADER
1
2
3
FOOTER
HEADER
1
2
3
LAST FOOTER
运行上面的命令。进而,
$ cat outfile
FIRST HEADER
1
2
3
1
2
3
1
2
3
1
2
3
LAST FOOTER
答案2
Kindly try with below steps and it worked fine
step1:
for i in file1 file2.........filen; do sed -i -e '1d' -e '$d' $i;cat $i >>final_file; done
step2
sed -i '1i Name' final_file
step3
sed '$s/.*/&\nNext date/g' final_file
答案3
你可以尝试使用这个 awk :
cat script_awk
NR == 1 {
# keep first header in a
a = $0
next
}
FNR == 1 {
# remove last line of File_n and header of File_n+1
a=""
next
}
{
if ( a )
# print previous line
print a
# keep last line in a
a=$0
}
END {
# print the last line (footer of last File)
print a
}
并这样称呼它:
awk -f script_awk File1 File2 File10
你可以这样称呼它:
awk -f script_awk File*
但不确定你是否得到了 File10 的页脚