`

《Linux Shell》之四:文件的排序、合并和分割

阅读更多

Linux的文本处理命令,包含sort、uniq、join、cut、paste、split、tr、tar,这些命令能实现对文件记录排序、统计、合并、提取、粘贴、分割、过滤、压缩和解压缩等,它们与sed和awk一起构成了Linux文本处理的所有命令和工具。

 

5.1 sort命令

# sort [选项] [输入文件]

选项 意义
-c 测试文件是否已经排序
-k 指定排序的域
-m 合并两个已排序的文件
-n 根据数字大小进行排序
-o [输出文件] 将输出写到指定的文件,相当于将输出重定向到文件
-r

将排序结果逆向显示

-t 改变域分隔符(默认是空格)
-u 去除结果中的重复行

 

先建立一个CARGO.db的示例文件:

 

Thindpad:USA:14000:2009:X301
Thinkpad:HongKong:10000:2008:T400
Thinkpad:USA:8000:2007:X60
HP:China:5600:2010:DM3
HP:China:12000:2010:NE808
SumSung:Korea:5400:2009:Q308
IdeaPad:China:8000:2007:U450

# sort -t: CARGO.db   #以默认方式对CARGO.db进行排序,注意-t跟:之间没有空格,也可以加空格

 

# sort -t : -k3 CARGO.db

注:-k3虽然是以第三个域来排序,但还是以默认的字符排序方法,不是数字,如果第三个域相同,那么再依次以第4个域、第5个域排序。

# sort -t : -k3n CARGO.db  #以第3个域并且以数字顺序排序

# sort -t : -k 3nr,3 -k 2,2 CARGO.db  #以第3个域数字逆排序,如果第3个域相同,以第2个域再排序

# sort -t : -k3nr CARGO.db  #以第3个域并且以数字顺序排序,逆向排序

# sort -t : -k3nr -o out CARGO.db  #不输出到标准输出中,而是重定向到out文件中去

# sort -t : -k3n -c CARGO.db  #测试一下第3个域是否已经安装数字排好了序

# sort -t: -k3n -m CARGO.db CARGO.db2  #将两个已经按照第3域数字排好序的文件合并

 

5.1.2 sort和awk的联合使用

文本块的排序,一个文件中有很多相似的段落,每个段落记录一个人的姓名地址等,如果段落排序:

# cat PROFESSOR.db | awk -v RS="" '{gsub("\n","@");print}' | sort | awk -v ORS="\n\n" '{gsub("@","\n");print}'

 注:awk -v 用于定义一个变量供后面使用,可以覆盖系统变量

可以看出当RS为空时,awk会自动以多行来做为分割符。 上面的RS也可以为RS="\n\n"

 

5.2 uniq命令

选项 意义
-c 打印每行在文本中重复的次数
-d 只显示有重复的记录,每个重复记录只出现一次
-u 只显示没有重复的记录

注意uniq跟sort -u的区别,uniq的重复行必须是连在一起才会去算的,分开了就另外算一条记录了。

#!/bin/bash
# 统计一个文件中每个单词出现的次数

ARGS=1        #输入参数个数为1,就是一个文件名
E_BADARGS=55  #输入参数错误码
E_NOFILE=56   #输入文件不存在

# 参数个数不为1,返回错误码E_BADARGS
if [ $# -ne "$ARGS" ];then
        echo "Usage: 'basename $0' filename"
        exit $E_BADARGS
fi

# 输入的文件名不存在,返回错误码E_NOFILE
if [ ! -f "$1" ];then
        echo "File \"$1\" does not exists."
        exit $E_NOFILE
fi

# 以下是核心算法
# sed命令用于过滤句号、逗号、分号,当然可以继续加上需要过滤的符号
# sed命令第4个-e选项将单词间的空格转化为换行符
# sort对sed过滤结果排序,每行一个单词
# uniq -c输出重复行的次数,sort -nr 按照出现频率从大到小排序
sed -e 's/[\.\,\:\;\!]/ /g' -e 's/\s\+/ /g' -e 's/\s\+$//g' -e 's/ /\n/g' "$1" | sort | uniq -c | sort -nr

exit 0

 

5.4 cut命令

cut命令用于从标准输入或文本文件中按域或字符提取文本

cut -c/-f/-d input

-c:指定提取的第几个字符或字符范围

-f:指定其他的第几个于或域范围

-d:改变域分隔符

# cut -c3 input.txt   -> 提取每行第三个字符

# cut -c1-5 input.txt   -> 提取每行第1至第5个字符

# cut -c1,5 input.txt   -> 提取每行第1和第5个字符

# cut -d: -f1,4 input.txt  -> 以:作为分隔符提取第1和第4个域

# cut -d: -f1-3 input.txt  -> 以:作为分隔符提取第1至第3域

 

5.5 paste命令

paste用于将文本文件或标准输出中的内容粘贴到新的文件中去,它可以将来自不同文件的数据粘贴在一起,输出到标准输出中去,或重定向到一个新的文件。

# paste [option] file1 file2

-d:默认域分隔符是空格或Tab键,设置新的域分隔符

-s:将每个文件粘贴成一行

-:从标准输入中读取数据

# paste -d@ FILE1 FILE2   -> 每一行FILE1输入在前,FILE2数据在后,然后用@分割

注:paste的-d跟其他sort、join、cut命令是不一样的,仅仅是为了设置输出文件的格式而已。

 

5.6 split命令

split命令用于将大文件切割成小文件,split命令可以按照文件的行数、字节数切割文件,并能在输出的多个小文件中自动加上编号。

# split [option] bigfile smallfile

- 或 -l:用于指定切割成的小文件的行数

-b:指定切割成的小文件的字节数

-C:与-b类似,也是指定字节数,但是切割时尽量维持每行的完整性

# split -2 big.txt small.txt

split命令切割成的小文件最多只能有1000行

# split -b100 big.txt small.txt

# split -C100 big.txt small.txt

 

--------------------------常见命令------------------------------

# 文件夹下面查找最大的文件:

# find -type f ! -path '*/.svn/*' -exec stat -c "%s %n" {} \;|sort -nr|head -10

分享到:
评论

相关推荐

    linux-Shell脚本管理

    Linux Shell脚本管理是Linux系统中非常重要的一部分,它涉及到用户与操作系统之间交互的方式。Shell脚本是用特定的Shell语法编写的程序,用于自动化执行一系列命令。本文将深入讲解Linux中常用的BASH Shell及其相关...

    LINUX与UNIX SHELL编程指南(很全)

    第11章 合并与分割 104 11.1 sort用法 104 11.1.1 概述 104 11.1.2 sort选项 104 11.1.3 保存输出 105 11.1.4 sort启动方式 105 11.1.5 sort对域的参照方式 105 11.1.6 文件是否已分类 105 11.1.7 基本sort 106 ...

    LINUX 与 UNIX SHELL编程指南

    以上总结了文档中提及的关于LINUX与UNIX SHELL编程的核心知识点,涵盖了文件操作、权限管理、文本处理、脚本编写、环境变量配置、工具使用等多个方面,适用于希望学习和提升shell编程技能的读者。

    关于linux日常使用的shell命令

    在 Linux 操作系统中,Shell 命令是用户与操作系统交互的重要方式之一。掌握常用的 Shell 命令对于提高工作效率、解决实际问题至关重要。本文将详细介绍标题及描述中提及的一些关键知识点。 #### 一、目录与文件...

    Linux原理与应用——专题1:Shell外围.ppt

    这些只是Shell脚本工具的冰山一角,实际上还有许多其他工具,如`grep`(搜索文本模式)、`sed`(流编辑器)、`find`(查找文件)、`sort`(排序)、`tr`(字符转换)等等,它们构成了Shell脚本的强大功能。...

    linux shell 编程教程

    linux shell编程 教程大全 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 ...

    Linux shell编程指南

    第四部分 基础shell编程 第16章 shell脚本介绍 151 16.1 使用shell脚本的原因 151 16.2 脚本内容 151 16.3 运行一段脚本 152 16.4 小结 153 第17章 条件测试 154 17.1 测试文件状态 154 17.2 测试时使用逻辑操作符 ...

    Linux与unix shell编程指南

    第四部分 基础shell编程 第16章 shell脚本介绍 151 16.1 使用shell脚本的原因 151 16.2 脚本内容 151 16.3 运行一段脚本 152 16.4 小结 153 第17章 条件测试 154 17.1 测试文件状态 154 17.2 测试时使用逻辑操作符 ...

    Linux指令一周通 (技术图书大系).azw3

    1.16 csplit指令:分割文件 1.17 cut指令:剪切文件 1.18 diff指令:生成差异信息 1.19 diffstat指令:diff结果的统计信息 1.20 dump指令:文件系统备份 1.21 file指令:辨识文件类型 1.22 find指令:查找目录或者...

    绝版经典《Linux与UNIX Shell编程指南》

    第11章 合并与分割 104 11.1 sort用法 104 11.1.1 概述 104 11.1.2 sort选项 104 11.1.3 保存输出 105 11.1.4 sort启动方式 105 11.1.5 sort对域的参照方式 105 11.1.6 文件是否已分类 105 11.1.7 基本sort 106 ...

    常用的shell命令.pptx

    在IT行业中,Linux Shell命令、Jenkins和Git是开发者日常工作中不可或缺的工具。下面将详细介绍这些领域的常用命令和概念。 **Linux Shell命令** Shell是Linux操作系统中的一个命令行解释器,它提供了用户与操作...

    LINUX与UNIX SHELL编程指南 高清PDF

    第四部分 基础shell编程 第16章 shell脚本介绍 151 16.1 使用shell脚本的原因 151 16.2 脚本内容 151 16.3 运行一段脚本 152 16.4 小结 153 第17章 条件测试 154 17.1 测试文件状态 154 17.2 测试时使用逻辑操作符 ...

    shell基础十二篇

    8. **文件分类、合并和分割**:`sort`用于排序文件,`uniq`去除重复行,`join`连接两个已排序文件,`cut`提取文件的部分列,`paste`合并多文件的对应行,`split`则将大文件拆分为多个小文件。 9. **tr**:转换和...

    150个常用的Linux命令汇总

    Linux 命令是 Linux 操作系统的核心组件之一,它们提供了对系统的控制和管理能力。以下是 150 个常用的 Linux 命令汇总,涵盖了文件和目录操作、查看文件及内容处理、文件压缩及解压缩、信息显示、搜索文件、用户...

    Shell_经典实例

    Bash(Bourne Again SHell)是最流行的Shell版本之一,广泛应用于各种Linux发行版和大部分Unix系统中。 #### 二、Shell脚本实例详解 ##### (一)目录树展示 - `dtree` 该脚本旨在显示指定目录下的文件结构,类似...

    Ubuntu Linux 命令行简明教程.pdf

    - `split`、`join`: 将大文件分割成小块或合并文件。 - **文件比较** - `cmp`: 比较两个文件的内容。 - `comm`: 比较两个已排序文件的行。 - `diff`: 高亮显示两个文件之间的差异。 - **文本查看与搜索** - `...

    Ubuntu.Linux.命令行简明教程

    - **4.4.7 文件分割**:学习如何使用`split`命令分割大文件。 - **4.4.8 文件合并**:使用`cat`等命令合并文件。 - **4.5 文件比较** - **4.5.1 比较两个文件**:使用`cmp`命令进行逐字节比较。 - **4.5.2 比较...

    shell实例手册

    Shell是Unix和Linux操作系统中最常用的一种命令行解释器,它允许用户通过文本界面与操作系统进行交互,执行各种任务。在本实例手册中,我们将探讨一些基本的Shell命令和技巧,帮助你更好地理解和运用Shell。 1. **...

    实验十二 Bash Shell相关指令练习

    实验十二主要围绕Bash ...通过这些练习,用户可以熟练掌握Bash Shell的基本操作,包括目录导航、文件管理、命令别名设置、输入输出重定向、条件判断以及文件过滤等技能,这对于日常的Linux系统管理和运维工作至关重要。

    Linux shell下30个有趣的命令和提示(推荐)

    23. **合并两个已排序文件的行**:`comm` 命令比较两个已排序文件,`comm file1 file2` 显示不同和共有的行。 24. **分割文件**:`split -l LINES -d file.txt output_prefix` 将大文件按行数拆分成多个小文件。 ...

Global site tag (gtag.js) - Google Analytics