连接文件,不包含每个文件的最后一行



我使用以下命令将大量文件连接到一个文件中:

$ cat num_*.dat > dataset.dat 

但是,由于文件的结构,我希望省略连接每个文件的前两行和后两行。这些行包含的文件信息对我来说并不重要。

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

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

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

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

接下来,接受它并在上运行以下尾部命令

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

我相信以下命令将作为一个命令发挥作用。

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

我在一个文件上测试了如下行:

第1行
第2行
第3行
1第4行
2第5行
3第6行7

这个会让你开始:

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

从上面的文件中打印:

第3行
第4行
第5行
1

挑战在于,当您使用cat filename*.dat或其他类似命令时,该命令会对所有文件进行cat操作,然后运行该命令一次,使其成为一个大文件,只删除第一个cated文件的前两行和最后一个catted文件的两行。

最终答案-需要编写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

我有两个文件,看起来如下:

第1行
第2行
第3行
1第4行
2第5行
3第6行7
2第1行
22第2行
2第3行
2第4行
1第5行
3第6行
<2第7行>
>

最终输出为:

第3行
第4行
第5行
2第3行<2第4行
2行5

for i in num_*.dat; do # loop through all files concerned
cat $i | tail -n +3 | head -n -2  >> dataset.dat
done

最新更新