• 使用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====="
  • 相关阅读:
    hdu 1254 推箱子(双重bfs)
    hdu 1495 非常可乐 (广搜)
    [leetcode-687-Longest Univalue Path]
    [leetcode-686-Repeated String Match]
    POJ 2287 田忌赛马 贪心算法
    [leetcode-304-Range Sum Query 2D
    [leetcode-682-Baseball Game]
    [leetcode-299-Bulls and Cows]
    [leetcode-319-Bulb Switcher]
    [leetcode-680-Valid Palindrome II]
  • 原文地址:https://www.cnblogs.com/cyttina/p/7471221.html
Copyright © 2020-2023  润新知