【问题标题】:Concatenate files without last lines of each one连接没有每个文件的最后一行的文件
【发布时间】:2021-07-06 23:21:31
【问题描述】:

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

 $ cat num_*.dat > dataset.dat 

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

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

【问题讨论】:

    标签: cat tail head


    【解决方案1】:

    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

    【讨论】:

    • 非常感谢您的解释。非常具有指导意义,对学习很有用。
    【解决方案2】:
    for i in num_*.dat; do # loop through all files concerned
    
      cat $i | tail -n +3 | head -n -2  >> dataset.dat
    
     done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      相关资源
      最近更新 更多