我想从第四行到最后一行列出文件的内容,然后在第一行到第三行显示内容形式,并将两个 o/p 都附加到一个新文件中。
4 回答
这将从第 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
更新
您也可以使用head
and来做到这一点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 个开头的行
这也可以使用 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很小,并且它作为单个进程运行,因此如果您以这种方式处理许多文件,它可能会快很多。
您可以尝试以下另一种方法:-
对于单行这将只打印文件中选定的 5 行
sed -n '5p' yourFilesPath
对于多行
sed -n '1,5p' yourFilesPath
使用“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 :)