【发布时间】:2021-07-06 23:21:31
【问题描述】:
我正在使用以下命令将大量文件连接成一个文件:
$ cat num_*.dat > dataset.dat
但是,由于文件的结构,我想省略连接每个文件的前两行和最后两行。这些行包含对我的必需品不重要的文件信息。
我知道 head 和 tail 的存在,但我现在不知道如何将它们组合到 UNIX 指令中来解决我的问题。
【问题讨论】:
我正在使用以下命令将大量文件连接成一个文件:
$ cat num_*.dat > dataset.dat
但是,由于文件的结构,我想省略连接每个文件的前两行和最后两行。这些行包含对我的必需品不重要的文件信息。
我知道 head 和 tail 的存在,但我现在不知道如何将它们组合到 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
我在一个文件上进行了测试,该文件的行如下:
1号线
2号线
3号线
4号线
5号线
6号线
7
这个会让你开始:
cat test.txt | head -n-2 | tail -n+3
从上面的文件打印:
3号线
4号线
5号线
挑战在于,当您使用 cat filename*.dat 或其他命令时,该命令会捕获所有文件,然后运行该命令一次,因此它变成一个大文件,只删除第一个 catted 文件的前两行以及最后一个 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行
第4行
第5行
第6行
行 7
2 行 1
2 行 2
2 行 3
2 行 4
2 行 5
2 行 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
【讨论】: