如何重新排列数据文件的行?每4行组将末行移至行首
没问题,这几个方法可以完美解决你的文本行重排需求——把每4行一组的最后一行移到组开头,同时保留首行的文件元信息:
方法一:用awk快速处理(推荐)
awk是处理这类文本行操作的绝佳工具,一行命令就能搞定,直接在终端运行即可:
NR == 1 {print; next} {lines[(NR-1)%4+1] = $0} (NR-1)%4 == 0 {print lines[4]; print lines[1]; print lines[2]; print lines[3]}
简单解释:
NR == 1 {print; next}:专门保留第一行的文件信息,直接打印后跳过后续处理,避免被分组影响{lines[(NR-1)%4+1] = $0}:从第二行开始,把每一行按组存入数组。这里的(NR-1)%4+1会自动把行号2-5对应数组索引1-4,行号6-9对应索引1-4,以此类推,完美实现每4行一组的分组逻辑(NR-1)%4 == 0:当处理到每组的最后一行(比如原数据的line4、line8对应的行号5、9),就先打印数组里的第4个元素(原组最后一行),再依次打印前三个元素,正好是你要的顺序
你可以把这段代码保存成rearrange.awk,然后运行:
awk -f rearrange.awk 你的输入文件名.txt > 输出文件名.txt
方法二:用Python脚本处理(适合灵活扩展)
如果需要更灵活的控制(比如处理超大文件、后续要加其他逻辑),Python脚本是更好的选择:
def rearrange_lines(input_file, output_file): with open(input_file, 'r', encoding='utf-8') as f_in, open(output_file, 'w', encoding='utf-8') as f_out: # 先写入首行的文件信息 first_line = f_in.readline() f_out.write(first_line) current_group = [] for line in f_in: # 保留原行格式,去掉换行符避免重复写入 clean_line = line.rstrip('\n') current_group.append(clean_line) # 每凑够4行就重排并写入 if len(current_group) == 4: # 把组内最后一行移到开头,拼接剩下的三行 rearranged_group = [current_group[-1]] + current_group[:-1] f_out.write('\n'.join(rearranged_group) + '\n') # 清空当前组,准备下一组 current_group = [] # 处理文件末尾可能剩余的不足4行的内容(如果有的话) if current_group: f_out.write('\n'.join(current_group) + '\n') # 调用示例,替换成你的文件名 rearrange_lines('input.txt', 'output.txt')
简单解释:
- 先读取并写入首行的文件元信息,确保它不参与分组
- 逐行读取后续内容,每收集4行就组成一个小组
- 对小组进行重排:把最后一行放到最前面,再拼接剩下的三行,写入输出文件
- 最后处理可能剩余的不足4行的内容,避免丢失数据
如果需要去掉行尾的注释(比如! this line need to move up),可以在clean_line = line.rstrip('\n')后面加一行:
clean_line = clean_line.split('!')[0].strip()
内容的提问来源于stack exchange,提问作者Binh Thien
相关产品推荐
相关产品推荐

