sed命令合并多个文件

sed命令合并多个文件

我想将多个文件合并为单个文件,并删除除第一个文件页眉和最后一个文件页脚之外的所有文件的页眉和页脚。

例如我有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,tailsed:

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 的页脚

相关内容