使用awk按照行数切割文件

最近在做一个事情,需要将一个文本文件按照行数进行切割,然后用了,awk的方法,感觉很好用, 记录一下。

脚本如下:

#!/bin/bash
## 文件效果: 根据行数来切割文件
## 参数1为要切割的文件名
## 参数2为每个切割后文件的行数

filename=$1
fileline=$2

echo "filename=$filename"
echo "fileline=$fileline"

awk -v count=$fileline ‘BEGIN{i=0} {  print $0 > sprintf("%s_%d",FILENAME,i) ; if (NR>=(i+1)*count) { close(sprintf("%s_%d",FILENAME,i)); i++;} }‘ $filename

echo "=====finish====="

简单解释一下, 比较重要的就是那一行awk

-v count=$fileline  , -v 用来将变量传入

BEGIN中用来初始化一个变量 i,  用来记录是否需要进行换文件, 之后将每一行输入到对应的文件中,

直到  NR>=(i+1)*count , 相当于一个文件已经写完了, 需要写入下一个文件。

这里需要做两件事情,先关闭之前写的文件, 如果不关闭, 会报错 awk: xxx makes too many open files , 这个表示awk 打开的文件太多了。

然后将计数器加1, 这样就可以写入下一个文件了。

运行效果,就是将 filename 切割成  filename_0 , filename_1, filename_2 等多个文件, 每个文件都是 fileline 行, 最后一个文件,就是剩下的行数。



可以很简单的得到下面这个变种, 就是 根据想要切割的文件数量来进行按照行数切割。

#!/bin/bash
## 根据文件数来切割
## 参数1为要切割的文件名
## 参数2为期望得到的文件数

filename=$1
filenum=$2# 计算每个文件的行数
fileline=$(( `cat $filename | wc -l ` / $filenum + 1 ))

echo "filename=$filename"
echo "filenum=$filenum"

awk -v count=$fileline ‘BEGIN{i=0} {  print $0 > sprintf("%s_%d",FILENAME,i) ; if (NR>=(i+1)*count) { close(sprintf("%s_%d",FILENAME,i)); i++;} }‘ $filename

echo "=====finish====="
时间: 2024-08-24 03:00:43

使用awk按照行数切割文件的相关文章

PowerShell工具脚本---按行数切割大文本文件

我编写的PowerShell工具脚本,[按行数切割大(文本)文件],生成n个小文件. 主要目的是为了能够让excel快速处理.或用脚本并发处理文本. 注意: 1 如果有必要,你可以先用其他工具,把大文本按行排序. 2 由于powershell本身就能自动识别win,linux换行.所以本脚本没有换行参数,也能正确分行. 3 win7+powershell2.0测试通过. 下载地址: http://files.cnblogs.com/files/piapia/split_file_ps_scrip

(转)Java按指定行数读取文件

package test import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; public class ReadSelectedLine{ // 读取文件指定行. static void readAppointedLineNumber(File sourceFile, int lineNumber) throws IOExcepti

python pandas使用chunksize异步拆分固定行数的文件

import pandas as pd import asyncio from collections import defaultdict collect = defaultdict(list) #######创建处理一个对象的方法,并返回期物 async def dealone(chunk,sas): path='/data/chaifen/testphone_%d.txt'%sas chunk.to_csv(path,index=False) return path async def s

PHP获取文件行数

原文出处 提供两种实现方法,但是第一种效率最好 第一种: <?php $file_path = 'test.txt'; //文件路径 此处找一个1094644行的TXT文件 test.txt $line = 0 ; //初始化行数 //打开文件 set_time_limit(0); echo "开始时间:".date("H:i:s")."</br>"; //此处设一个计时器 开始时间 $fp = fopen($file_path

统计代码文件中的实际有效行数,去掉空行、单行注释、多行注释

#coding=gbk import os #rootdir='f:\\pylianxi' def count_line_core(file_name): ##传入单个文件,统计行数,之后返回该文件的实际代码行数:区分utf-8.gbk有待优化 print('core_file_name:',file_name) lines_count=0 flag=True try: with open(file_name,'r',encoding='gbk') as fp: print('gbk file_

shell(十一)切割文件

1. 按指定大小切割 2. 按指定行数切割 合并 diff无输出意味着两个文件passwd和/etc/passwd相等

【VBA研究】用VBA取得EXCEL随意列有效行数

作者:iamlaosong 用VBA对Excel文件进行处理的时候,keyword段的列号编程时往往是不知道的.须要通过參数设定才干知道,因此.我们编程的时候,就不能用这种语句取有效行数: lineno = [B65536].End(xlUp).Row          '从下至上找有效行数 上述语句中的列名"B"假设是变量.能够用字符串连接的方式实现,即: pos_ems = "C" lineno = Range(pos_ems & "65536

hdfs统计行数和统计文件大小

使用hdfs有时候需要统计文件行数和文件的大小 1.hdfs下载文件夹中多个文件 hadoop fs -get  /目录   目录 2.统计多个文件行数 hadoop fs -cat  /文件* | wc -l 3.统计文件大小 hadoop fs -count /文件* 统计单个文件  只需要精确到文件即可

【VBA研究】用VBA取得EXCEL任意列有效行数

作者:iamlaosong 用VBA对Excel文件进行处理的时候,关键字段的列号编程时往往是不知道的,需要通过参数设定才能知道,因此,我们编程的时候,就不能用这样的语句取有效行数: lineno = [B65536].End(xlUp).Row 上述语句中的列名"B"如果是变量,可以用字符串连接的方式实现,即: pos_ems = "C" lineno = Range(pos_ems & "65536").End(xlUp).Row 如