1

我想从第四行到最后一行列出文件的内容,然后在第一行到第三行显示内容形式,并将两个 o/p 都附加到一个新文件中。

4

4 回答 4

5

这将从第 4 行打印到最后一行。

awk 'NR>=4' file

这将从第一行打印到第三行。

awk 'NR<4' file

要按此顺序获得所有输出:

awk 'NR>=4' file >  new_file
awk 'NR<4'  file >> new_file

测试

$ cat a
line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
$ awk 'NR>=4' a
line4
line5
line6
line7
line8
line9
line10
$ awk 'NR<4' a
line1
line2
line3
$ awk 'NR>=4' a > new_file
$ awk 'NR<4' a >> new_file
$ cat new_file 
line4
line5
line6
line7
line8
line9
line10
line1
line2
line3

更新

您也可以使用headand来做到这一点tail

$ tail -n +4 a
line4
line5
line6
line7
line8
line9
line10
$ head -n 3 a
line1
line2
line3

我们使用with-n选项:tail+

-n,--行=K

输出最后 K 行,而不是最后 10 行;或使用 -n +K 输出以第 K 个开头的行

于 2013-09-17T15:49:41.290 回答
2

这也可以使用 sed 来完成:

$ sed -ne '4,$p' inp.txt > out.txt
$ sed -ne '4q;p' inp.txt >> out.txt

sed 3q inp.txt >> out.txt如果您愿意,可以缩短最后一行。我这样做是为了如果你想使用单个断点自动生成你的 sed 脚本,你不需要做任何额外的数学运算。

当然,你也可以使它成为一个更复杂的单行:

$ sed -ne '1x;2,3H;4,$p;${x;p;}' inp.txt > out.txt

细分是这样的:

  • 1x- 将第一行存储在 sed 的“保持”缓冲区中。
  • 2,3H- 将后续行追加到“保持”缓冲区,直到我们的断点。
  • 4,$p- 如果当前行号是“4 到末尾”,则打印它。
  • ${x;p;}- 在最后一行,交换保持缓冲区和模式空间,然后打印。

这可能看起来有点神秘。它是。如果您的断点(“4”)是一个会改变的数字,则需要更多的数学运算。但是 sed很小,并且它作为单个进程运行,因此如果您以这种方式处理许多文件,它可能会快很多。

于 2013-09-18T08:27:09.660 回答
0

您可以尝试以下另一种方法:-

对于单行这将只打印文件中选定的 5 行

sed -n '5p' yourFilesPath

对于多行

sed -n '1,5p' yourFilesPath
于 2013-09-18T08:43:16.043 回答
0

使用“head”和“tail”命令的问题是您需要知道给定文件中的总行数。您可以使用“wc”命令来了解文件中的行数。

wc -l < file会给你行数。

echo `expr \`wc -l < file\` - 3`将为您提供 > 3 的行数。将其提供给 tail 命令。而已。

-bash-2.05b$ tail -`expr \`wc -l < file\` - 3` file
line4
line5
line6
line7
line8
line9
line10
-bash-2.05b$
-bash-2.05b$ head -3 file
line1
line2
line3
-bash-2.05b$
-bash-2.05b$ tail -`expr \`wc -l < file\` - 3` file> output_file
-bash-2.05 b$ head -3 file >> output_file
-bash-2.05b$
-bash-2.05b$ cat output_file
line4
line5
line6
line7
line8
line9
line10
line1
line2
line3

不像之前发布的答案那么优雅,而只是另一种方式。请注意,此解决方案将一直有效,直到行数 >= 3 :)

于 2013-09-18T14:37:42.323 回答