我有一个名为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
拉入的每行打印其中的第一行。
- Onlines
1,10
sed
P
不会打印任何内容,因为对于每个行,它都在牧场循环中逐行地将输入堆叠在模式空间中b
。 - 在第 3 行,所有 的
sed
堆栈都被d
删除 - 因此前 3 行被一下子从输出中剥离。 - 当
sed
到达$
输入的最后一行并尝试拉入N
ext 时,它会遇到 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