Linux 合并头和尾并输出文件

Linux 合并头和尾并输出文件,linux,cat,tail,head,Linux,Cat,Tail,Head,我搜索了一下,但没有发现任何有用的东西。我有一个file.txt,我想提取前50行和最后50行,并将它们输出到一个新文件中。我试过: head -n50 && tail -n50 > newfile.txt 但这只给了我头像 任何帮助>创建一个: 或再次重定向以附加到同一文件: head -n50 file.txt > newfile.txt && tail -n50 file.txt >> newfile.txt 制作一个: 或再次重

我搜索了一下,但没有发现任何有用的东西。我有一个file.txt,我想提取前50行和最后50行,并将它们输出到一个新文件中。我试过:

head -n50 && tail -n50 > newfile.txt
但这只给了我头像

任何帮助>

创建一个:

或再次重定向以附加到同一文件:

head -n50 file.txt > newfile.txt && tail -n50 file.txt >> newfile.txt
制作一个:

或再次重定向以附加到同一文件:

head -n50 file.txt > newfile.txt && tail -n50 file.txt >> newfile.txt

您不想读取数据两次。一个典型的解决方案是在awk中实现一个环形缓冲区,但这有点麻烦。阅读一次对头部来说是困难的,因为它可能会消耗所有的数据,而不会给尾部留下任何数据,所以你不能只在头部后面跟着尾部运行。但您可以利用read的功能,一次不阅读多行内容,并执行以下操作:

{ for i in $(seq 50); do read line; printf "%s\n" "$line"; done; tail -50; } < file.txt > newfile.txt
{for i in$(seq 50);do read line;printf“%s\n”“$line”;done;tail-50;}newfile.txt

这将避免重复重叠行(例如,如果只有30行输入,则无法获得60行输出)。

您不想读取两次数据。一个典型的解决方案是在awk中实现一个环形缓冲区,但这有点麻烦。阅读一次对头部来说是困难的,因为它可能会消耗所有的数据,而不会给尾部留下任何数据,所以你不能只在头部后面跟着尾部运行。但您可以利用read的功能,一次不阅读多行内容,并执行以下操作:

{ for i in $(seq 50); do read line; printf "%s\n" "$line"; done; tail -50; } < file.txt > newfile.txt
{for i in$(seq 50);do read line;printf“%s\n”“$line”;done;tail-50;}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
gawk'BEGINFILE{lineCount=0;while((getline-line0){lineCount++}(FNR=lineCount-50){print}input_file.txt>output_file.txt

从技术上讲,您仍在读取同一个文件两次,但至少在单个程序中发生。

您也可以在无环形缓冲区的gawk中执行此操作,方法是计算行数并将计数与记录数进行比较:

gawk 'BEGINFILE {lineCount=0; while ((getline line < FILENAME) > 0 ) {lineCount++}} (FNR <= 50 || FNR >= lineCount-50 ) {print}' input_file.txt > output_file.txt
gawk'BEGINFILE{lineCount=0;while((getline-line0){lineCount++}(FNR=lineCount-50){print}input_file.txt>output_file.txt

从技术上讲,您仍然在读取同一个文件两次,但至少在单个程序中发生。

当输入只有30行时,您想要什么输出?如果有51行输入,您想要100行输出?当输入只有30行时,您想要什么输出?如果有51行输入,你想要100行输出吗?