【发布时间】:2025-12-13 06:55:02
【问题描述】:
我进行了搜索,但没有找到任何工作。我有一个file.txt,我想提取前50行和后50行,并将它们输出到一个新文件中。我试过了:
head -n50 && tail -n50 > newfile.txt
但这只会给我头文件。
任何帮助>
【问题讨论】:
-
当输入只有30行时,你想要什么输出?
-
如果有51行输入,你要100行输出吗?
我进行了搜索,但没有找到任何工作。我有一个file.txt,我想提取前50行和后50行,并将它们输出到一个新文件中。我试过了:
head -n50 && tail -n50 > newfile.txt
但这只会给我头文件。
任何帮助>
【问题讨论】:
{ head -n50 file.txt && tail -n50 file.txt; } > newfile.txt
或再次重定向以附加到同一个文件:
head -n50 file.txt > newfile.txt && tail -n50 file.txt >> newfile.txt
【讨论】:
您不想读取数据两次。一个典型的解决方案是在 awk 中实现一个环形缓冲区,但这有点痛苦。读取一次对 head 来说是很困难的,因为它可能会消耗所有的数据而没有给 tail 留下任何数据,所以你不能只运行 head 后跟 tail。但是你可以利用 read 一次不读多行的特性,然后这样做:
{ for i in $(seq 50); do read line; printf "%s\n" "$line"; done; tail -50; } < file.txt > newfile.txt
这将避免重复重叠的行(例如,如果您只有 30 行输入,则不会得到 60 行输出)。
【讨论】:
您也可以在没有环形缓冲区的情况下在 gawk 中执行此操作,方法是计算行数并将计数与记录数进行比较:
gawk 'BEGINFILE {lineCount=0; while ((getline line < FILENAME) > 0 ) {lineCount++}} (FNR <= 50 || FNR >= lineCount-50 ) {print}' input_file.txt > output_file.txt
从技术上讲,您仍在读取同一个文件两次,但至少发生在一个程序中。
【讨论】: