如何使用 shell 命令删除 ascii 文件的前 n 行?

如何使用 shell 命令删除 ascii 文件的前 n 行?

我有多个文件,其中前 5-10 行包含 ascii 文本信息,后面是精心制表的矩阵信息。在 shell 脚本中,我想删除前几行文本,以便可以在另一个程序中使用纯矩阵信息。如何使用 bash shell 命令来执行此操作?

如果有帮助的话,我正在使用 RedHat 和 Ubuntu Linux 系统。

答案1

只要文件不是符号链接或硬链接,就可以使用 sed、tail 或 awk。下面的例子。

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

您还可以在没有临时文件的情况下就地使用 sed:sed -i -e 1,3d yourfile。这不会回显任何内容,它只会就地修改文件。如果您不需要将结果通过管道传递给另一个命令,这会更容易。

尾巴

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90

答案2

sed -i '1,3d' file.txt

这将从 file.txt 中删除前 3 行。

答案3

如果列表行是带有制表符的行:

grep '␉' <input_file >output_file

作为文字制表符)或等效的

sed -n '/␉/p' <input_file >output_file

在 bash/ksh/zsh 脚本中,您可以编写$'\t'选项卡,例如grep $'\t'sed -n $'/\t/p'

如果要删除文件开头的 10 行:

tail -n +11 <input_file >output_file

(注意,这是+11为了消除 10 行,因为+11意味着“从第 11 行开始”,尾部编号从 1 行开始)或

sed '1,10d' <input_file >output_file

在 Linux 上,您可以利用 GNU sed 的-i选项来就地修改文件:

sed -i -n '/\t/p' *.txt

或者您可以使用 shell 循环和临时文件:

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

或者,如果您不想就地修改文件,而是给它们一个不同的名称:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done

答案4

按百分比

使用bash, 使用百分比数字而不是绝对行数来清理文件:

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

请注意,该命令可能具有破坏性,因为它会就地删除内容,而不创建副本。

它会从上述文件中删除前 75% 的行。

相关内容