如何使用 shell 命令删除文件的前 n 行和最后一行?

如何使用 shell 命令删除文件的前 n 行和最后一行?

我有一个名为Element_query包含查询结果的文件:

SQL> select count (*) from element;

[Output of the query which I want to keep in my file]

SQL> spool off;

我想使用 shell 命令删除第一行和最后一行。

答案1

使用 GNU sed

sed -i '1d;$d' Element_query

怎么运行的 :

  • -i选项编辑文件本身。如果需要,您还可以删除该选项并将输出重定向到新文件或另一个命令。
  • 1d删除第一行(1仅作用于第一行,d将其删除)
  • $d删除最后一行($仅作用于最后一行,d将其删除)

更进一步:

  • 您还可以删除范围。例如,1,5d删除前 5 行。
  • 您还可以删除以SQL>using 语句开头的每一行/^SQL> /d
  • 您可以删除每个空白行/^$/d
  • 最后,您可以通过用分号 ( statement1;statement2;satement3;...) 分隔或在命令行上单独指定 ( -e 'statement1' -e 'statement 2' ...)来组合任何语句

答案2

头;头

{   head -n[num] >/dev/null
    head -n[num]
}  <infile >outfile

通过上面的内容,您可以指定要从第一个命令的输出头部剥离的第一个行数head,以及要写入的行数outfile与第二个。它通常也会比sed- 特别是当输入是更快的时候大的- 尽管需要两次调用。哪里sed肯定应该<infile不过,在这种情况下是首选不是一个常规的,可搜索的文件 - 因为这通常会不是在这种情况下按预期工作,但sed可以在单个脚本化进程中处理所有输出修改。

对于 GNU,head您可以使用-否定形式[num]在第二个命令中也是如此。在这种情况下,以下命令将从输入中删除第一行和最后一行:

{   head -n1 >/dev/null
    head -n-1
}  <infile >outfile

或者使用 POSIX sed

举例来说,我正在读取 20 行的输入,我想删除前 3 行和最后 7 行。如果我决定使用 w/ 这样做sed,我会使用尾部缓冲区来完成。我首先将三和七相加,总条数为十,然后执行以下操作:

seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D

这是一个从输入中删除前 3 行和后 7 行的示例。这个想法是,您可以缓冲尽可能多的行,从堆栈上的模式空间中的输入尾部剥离,但只为P拉入的每行打印其中的第一行。

  • Onlines1,10 sed P不会打印任何内容,因为对于每个行,它都在牧场循环中逐行地将输入堆叠在模式空间中b
  • 在第 3 行,所有 的sed堆栈都被d删除 - 因此前 3 行被一下子从输出中剥离。
  • sed到达$输入的最后一行并尝试拉入Next 时,它会遇到 EOF 并完全停止处理。但那时图案空间包含了所有的线条14,20——没有一条线条被P印刷过,也从来没有被印刷过。
  • 在每隔一行上,sed P仅打印到\n模式空间中第一个出现的 ewline,并D在开始新循环之前删除相同的内容 - 或接下来的 6 行输入。第 7 行在N新的循环中用 ext 命令再次追加到堆栈中。

所以, ofseq的输出(这是 20 个连续编号的行)sed仅打印:

4
5
6
7
8
9
10
11
12
13

当您希望从输入尾部剥离的行数很大时,这就会出现问题 - 因为sed的性能与其模式空间的大小成正比。尽管如此,在许多情况下它仍然是一个可行的解决方案 - 并且 POSIX 规范了一个sed模式空间,在崩溃之前可以处理至少 4kb。

答案3

尝试这个解决方案:

tail -n +2 name_of_file | head -n-1

定制化

您可以轻松地修改它以删除前 n 行,+2更改tail;
或删除最后 n 行-1更改head

答案4

您可以选择范围之间的行awk(假设您知道有多少行):

awk 'NR>1 && NR < 3' file

或者在 Perl 中:

perl -ne 'print if $.>1 && $.<3' file

如果您不知道有多少行,您可以使用以下命令即时计算grep(请注意,这不会计算空白行,grep -c '' file也可以使用它们来计算空行):

awk -vm="$(grep -c . file2.txt)" 'NR>1 && NR<m' file2.txt

相关内容