我使用以下命令将大量文件连接到一个文件中:
$ cat num_*.dat > dataset.dat
但是,由于文件的结构,我希望省略连接每个文件的前两行和后两行。这些行包含的文件信息对我来说并不重要。
我知道head
和tail
的存在,但我现在不知道如何在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