合并文件首尾内容并输出:head与tail命令提取首尾行遇问题
解决方法:合并head和tail的输出到同一文件
你遇到的问题主要是两个核心问题:没有指定要处理的目标文件,以及重定向范围只覆盖了tail命令,导致head的输出直接打到终端,而tail因为没指定输入源可能根本没产生有效输出。下面给你几种可行的解决方案:
方法1:分步写入(覆盖+追加)
先让head把前50行写入新文件(覆盖原有内容),再让tail把最后50行追加到该文件:
head -n 50 file.txt > newfile.txt && tail -n 50 file.txt >> newfile.txt
- 优点:逻辑直观,新手容易理解
- 注意:如果
newfile.txt之前已经存在,>会先清空它,再写入前50行;>>是追加模式,不会覆盖已有内容。
方法2:命令组统一重定向
用大括号把两个命令包起来,让它们的输出一起重定向到目标文件,只需要一次重定向操作:
{ head -n 50 file.txt; tail -n 50 file.txt; } > newfile.txt
- 细节提醒:大括号
{后面要有空格,每个命令结尾的分号;不能省略,这是bash语法要求 - 优点:比方法1更高效,因为只打开一次目标文件进行写入
方法3:进程替换合并输出
利用bash的进程替换特性,把head和tail的输出当作临时文件,用cat拼接后写入目标文件:
cat <(head -n 50 file.txt) <(tail -n 50 file.txt) > newfile.txt
- 优点:写法简洁,适合熟悉bash高级特性的用户,不需要分两次操作
为什么你的原命令不行?
你的命令head -n50 && tail -n50 > newfile.txt存在两个关键问题:
- 没有指定输入文件:
head和tail默认从标准输入(键盘)读取内容,而不是从file.txt读取,所以head会一直等你输入,直到你手动结束; - 重定向范围错误:就算你补上了
file.txt,写成head -n50 file.txt && tail -n50 file.txt > newfile.txt,head的输出会直接打印到终端,只有tail的内容会写入newfile.txt,这不符合你要合并两行输出的需求。
内容的提问来源于stack exchange,提问作者Steveman30290
相关产品推荐
相关产品推荐

