合并文件命令简单介绍,文件分割与联合

By admin in 美高梅手机版4858 on 2019年5月6日

paste命令

成效:合并文件

格式:

paste [option] [file]

1,把五个公文的原委,按行合并

ghostwu@dev:~/linux/paste$ ls
ghostwu1.txt  ghostwu2.txt
ghostwu@dev:~/linux/paste$ cat ghostwu1.txt 
1
2
3
4

5
6
ghostwu@dev:~/linux/paste$ cat ghostwu2.txt 
hi
hello
nihao
你好啊
how are you
fine think you
ghostwu@dev:~/linux/paste$ paste ghostwu1.txt ghostwu2.txt 
1    hi
2    hello
3    nihao
4    你好啊
    how are you
5    fine think you
6    
ghostwu@dev:~/linux/paste$ 

-d 钦定分隔符

ghostwu@dev:~/linux/paste$ paste -d : ghostwu1.txt ghostwu2.txt 
1:hi
2:hello
3:nihao
4:你好啊
:how are you
5:fine think you
6:

-s 各样文件占用1行

ghostwu@dev:~/linux/paste$ paste -s ghostwu1.txt 
1    2    3    4        5    6
ghostwu@dev:~/linux/paste$ paste -s ghostwu2.txt 
hi    hello    nihao    你好啊    how are you    fine think you
ghostwu@dev:~/linux/paste$ paste -s ghostwu1.txt ghostwu2.txt 
1    2    3    4        5    6
hi    hello    nihao    你好啊    how are you    fine think you

 把3个文件的奇偶行,用=号会换行符号连接

ghostwu@dev:~/linux/paste$ cat account.txt 
hello
abc123
hello2
haha123
baby
baby123
ghostwu@dev:~/linux/paste$ paste -sd '=\n' account.txt > account2.txt
ghostwu@dev:~/linux/paste$ cat account2.txt 
hello=abc123
hello2=haha123
baby=baby123

 

目前遇见如下的三个标题 怎样快捷合并多少个大文件?

paste 命令用于合并文件的行。它能够统壹1个文本或四个公文中的行。


有A,B多个公文。那七个文件都有以下特征

paste 命令的语法如下所示:

目录

  1. A,B多个公文每壹行都足以被解析为json 格式

  2. A,B三个公文都相当的大(至少超越500M)

  3. A,B三个文件能够通过将每行转化为json之后经过有些同样key的值合并

  4. A文件有a行,B文件有b行

  5. A,B七个文本两行能够统一的准绳是无与伦比的。

    比方 A文件的率先行能够是那样的三个json

    {

    ​ ‘id’:1,

    ​ ‘test’: 2

    }

    B文件的第贰行能够是如此的三个json

    {

    ‘id’:1,

    合并文件命令简单介绍,文件分割与联合。’test2′:3

    }

    大家得以经过七个同样的key合并为如此二个json

    {

    ‘id’:1,

    ‘test’:2,

    ‘test2’:3

    }

paste [OPTION]... [FILE]...

1. 前记
2. 文书分割(split)
  2.一 命令语法
  二.二 使用实例
    (一)查看文件总行数
    (二)分割文件
    (三)分割结果
三. 文书合并(cat)
  三.一 命令语法
  三.二 使用实例
    (1)合并全体已分割文件并查进行数
    (贰)合并一些已分割文件并查证行数

最近的标题就是何许把他们统一?

明日有如下五个示范文件:


率先个想法——暴力合并

演示文件

1、前记

Linux学习种类主要重视数据管理的一声令下实战学习,包罗但不限于awk,grep,sed等一声令下的实战学习。

  1. 先读取A文件的一条龙数据,然后转向为json格式
  2. 将A某一行的json格式的数量同B文件中的数据一一校验,判别多个数据数据是不是能够统1

默认情形下,使用 paste
命令合并文件,各文件中的各行将以制表符(Tab)作为分隔符实行联合并出口:

2、文件分割(split)

美高梅手机版4858,统一之后的输出

2.一 命令语法

split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]

参数解释

  • -a:钦赐输出文件名的后缀长度,默感觉三个(aa,ab…);
  • -d:点名输出文件名的后缀用数字代表;
  • -l<行数>:行数分割格局,钦命每多少行切成2个小文件;
  • -b<字节>:贰进制分割情势,内定每多少字切成叁个小文件,支持单位:m,k;
  • -C<字节>:文件大小分割方式,与-b参数近似,但切割时尽恐怕保障每行的完整性;
  • –help:来得援助;
  • –version:彰显版本音讯;
  • [输出文件名]:安装切割后文件的内置文件名,split会自动在放置文件名后再增添编号。

这一个主张的算法复杂度是o(a*b),当文件的行数十分的大的时候,情状很焦虑。以自己当下的管理的五个文本来讲,七个文本都以九万多行。对于cpu来讲,他最坏的时候供给七千0
*
70000次指令。近日的cpu每秒大概能实施百万级的吩咐,那么实行这么些统1操作也急需贰个钟头的时刻

运用 -d 选项,能够钦赐各类文件中的各行在统一时半刻所使用的相间符:

二.2 使用实例

(一)查看文件总行数

wc -l seven.sql

输出:3307194 seven.sql,即约330万行,分割时以30万行为单位。

(2)分割文件

split -l 300000 seven.sql /home/kinson/Desktop/test1/seven_
--解释:
--参数"l"表示按行分割;
--"300000"表示每个文件30w行
--"seven.sql"为将分割文件;
--"/home/kinson/Desktop/test1/seven_"为分割后的文件路径与命名。

(三)分割结果

分割结果

其次个章程-先预管理一下

行使分隔符的功用

3、文件合并(cat)

cat命令的用途是连连文件或规范输入并打字与印刷。这几个命令常用来显示文件内容,或许将多少个文件连接起来展现,只怕从典型输入读取内容并显示,它常与重定向符号同盟使用。

cat重要有如下叁大功效:

  • 一回呈现整个文件:cat filename;
  • 从键盘创制八个文书:cat > filename
    只可以成立新文件,不能够编辑已有文件;
  • 将多少个文本合并为一个文本:cat file壹 file二 > file。

咱俩得以先算出A文件中哪一行数据能够同B文件中哪几行的文件。因为联合的规则是无与伦比的。那么对于大家将来的拍卖的文本来说是算法复杂度为o(max(a,b))

当合并三个以上文件的时候,也足以内定多个分隔符:

三.一 命令语法

cat [-AbeEnstTuv] [--help] [--version] fileName 

参数解释

  • -A:–show-all,等价于 -vET;
  • -b: –number-nonblank,对非空输出游编号;
  • -e:等价于 -vE;
  • -E: –show-ends,在每行结束处突显 $;
  • -n:–number,对输出的装有行编号,由一早先对具备出口的行数编号;
  • -s:–squeeze-blank,有连日两行以上的空白行,就调换为一行的空白行;
  • -t:与 -vT 等价;
  • -T:–show-tabs,将跳格字符显示为 ^I;
  • -v:–show-nonprinting,使用 ^ 和 M- 引用,除了 LFD 和 TAB
    之外。

唯独这么些算法依然有2个主题素材,当你早已领悟三个文本哪俩行的公文要求联合的。你怎么样从那四个大文件中急忙的读出那两行文件。

钦命多少个分隔符

叁.2 使用实例

(一)合并全体已分割文件并查进行数

cat test1/seven_* >newseven
wc -l newseven

输出:3307194 newseven,与原著件seven.sql行数一致。

(二)合并一些已分割文件并检查行数

cat test1/seven_aa > seven_part
cat test1/seven_ab >> seven_part
cat test1/seven_ac >> seven_part
wc -l seven_part 

>>意味着追加,输出900000 seven_part,即集结了一个公文,各类30万行,所以会集后文件总行数为90万行。


个人Github
个人博客whenif
欢迎各路同学互相交换

自小编眼下的主张是记录每壹行的偏移量的地方。

运用 -s 选项,paste
命令能够顺序地联合文件,即它每一个地将种种文件中的全部行的剧情统1为1行,由此各种文件的从头到尾的经过被联合为单纯的一行:

笔录偏移量的话小编刚开端是想使用以下代码的措施的。直接把公文中的数据读到内部存款和储蓄器中

使用 -s 选项

实行以下代码,27陆M 供给二秒,一柒G 须要拾秒

运用 paste 命令,将文件的原委由1列调换为多列(3个“-”为壹列):

def test_merge(filename):
    start_time = time.time()
    print "start {} function is {}".format(test_merge.__name__, start_time)

    f = open(filename, "r")
    line = []
    line.append(0)
    filename_size = os.path.getsize(filename)
    chars = f.read(filename_size)
    count = 0
    for char in chars:
        if char == '\n':
            line.append(count)
        count = count + 1

转移为多列

只是上边的代码在当文件十分的大的时候是很轻巧爆内部存款和储蓄器的.

正文参考自 《Linux
Shell命令行及脚本编制程序实例详解》

据此在此咱们能够利用第二个函数能够因此,先计算出每种文件的高低,然后各个读出根号大小的数

def merge_by_file(filename):
    start_time = time.time()
    print "start {} function is {}".format(merge_by_file.__name__,start_time)

    f = open(filename, "r")
    line = []
    line.append(0)
    filename_size = os.path.getsize(filename)
    filename_length = int(math.sqrt(filename_size))
    count = 0
    print filename_length
    for i in xrange(filename_length + 2):
        if count + filename_length < filename_size:
            chars = f.read(filename_length)
            for char in chars:
                count = count + 1
                if char == '\n':
                    line.append(count)
        else:
            chars = f.read(filename_size - count)
            for char in chars:
                count = count + 1
                if char == '\n' and count != filename_size:
                    line.append(count)
            break
    f.close()

由此,笔者在拍卖多个玖万行文件的剧本每一回运转的时日收缩到贰分钟。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有