连接每个文件没有最后一行的文件

Concatenate files without last lines of each one

我正在使用以下命令将大量文件连接成一个文件:

 $ cat num_*.dat > dataset.dat 

但是,由于文件的结构,我想省略连接每个文件的前两行和最后两行。这些行包含对我的需求不重要的文件信息。

我知道 headtail 的存在,但我现在不知道如何将它们组合在 UNIX 指令中来解决我的问题。

head 命令有一些奇怪的参数用法。

您可以使用以下命令列出除最后两行之外的所有行。

$ cat num_*.dat | head -n-2  > dataset.dat

下一步,运行 执行下面的 tail 命令

$ tail dataset.dat -n+3 >> dataset.dat

我相信以下命令可以作为一个命令使用。

$ cat num_*.dat | head -n-2 | tail -n+3 > dataset.dat

我在一个包含如下行的文件上进行了测试:

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7

这篇文章将帮助您入门:

cat test.txt | head -n-2 | tail -n+3

从上面的文件打印:

Line 3
Line 4
Line 5

挑战在于,当您使用 cat filename*.dat 或任何命令对所有文件进行 cat 时,然后 运行s 命令一次,这样它就变成了一个大文件,只删除了第一个文件第一个 catt 文件的两行和最后一个 catt 文件的两行。

最终答案 - 需要编写 Bash 脚本

我写了一个 bash 脚本来为您做这件事。 这将遍历目录中的每个文件和 运行 命令。 请注意,它将 (>>) 附加到 dataset.dat 文件。

for file in num_*.dat; do
    if [ -f "$file" ]; then
        cat $file | head -n-2 | tail -n+3 >> dataset.dat
        echo "$file"
    fi
done

我有两个文件如下所示:

line 1
line 2
line 3
line 4
line 5
line 6
line 7
2 line 1
2 line 2
2 line 3
2 line 4
2 line 5
2 line 6
2 line 7

最终输出为:

line 3
line 4
line 5
2 line 3
2 line 4
2 line 5

for i in num_*.dat; do # loop through all files concerned

  cat $i | tail -n +3 | head -n -2  >> dataset.dat

 done