扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
linux基础-字符处理
成都创新互联于2013年创立,是专业互联网技术服务公司,拥有项目成都网站设计、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元罗源做网站,已为上家服务,为罗源各地企业和个人服务,联系电话:18980820575
linux管道命令(pipe)
菜鸟教程
管道是一种通信机制,通常用于进程间的通信,它表现出来的形式将前面每一个进程的输出直接作为下一个进程的输入。
管道命令使用 | 作为界定符号。
默认情况下,sort命令以第一列进行排序
反向排序
按指定列进行排序,默认是空白符,也可以用 -t 指定分隔符
第二列排序的时候可以加 -n 进行数值排序
进行排序后,排序结果会显示在终端,但是原文件不会改变,可以用-o重定向或者另存。用 覆盖某个文件会失败,数据被清空,但是用 追加可以
为初学者提供的uniq命令教程及示例
uniq 命令用于检查及删除文本文件中重复出现的行列。uniq命令只有在相邻的情况下才会删除重复的行,因此一般与 sort 命令结合使用,此外,该命令也可以检查文本文件中重复出现的行列,默认区分大小写。
准备一个文件
准备一个文件
以分割符指定分割某些特定的列
Linux tr 命令用于转换或删除文件中的字符。
tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。
语法:tr [OPTION]…SET1[SET2]
小写转换为大写
删除字符
Linux paste 命令用于合并文件的列。
paste 指令会把每个文件以列对列的方式,一列列地加以合并。
不加参数会默认以制表符为分界列对列合并
-d可以设置以何种字符合并
使用s参数时。单个文件会将该文件的多行数据合并成一行显示,多个文件会将各个文件单独合并成一行之后再行对行合并
Linux split命令用于将一个文件分割成数个。
该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。
将根目录文件信息写入文件
对上面的文件9行为一个文件进行分割
以1k字节分割文件
不加参数会同时显示行数,字数,Bytes数,加上上述参数会单独显示其中一项
uniq 命令
文字
uniq 是LINUX命令
用途
报告或删除文件中重复的行。
语法
uniq [ -c | -d | -u ] [ -f Fields ] [ -s Characters ] [ -Fields ] [ +Characters ] [ InFile [ OutFile ] ]
描述
uniq 命令删除文件中的重复行。
uniq 命令读取由
InFile 参数指定的标准输入或文件。该命令首先比较相邻的行,然后除去第二行和该行的后续副本。重复的行一定相邻。(在发出 uniq
命令之前,请使用 sort 命令使所有重复行相邻。)最后,uniq 命令将最终单独的行写入标准输出或由 OutFile
参数指定的文件。InFile 和 OutFile 参数必须指定不同的文件。如果输入文件用“-
”表示,则从标准输入读取;输入文件必须是文本文件。文本文件是包含组织在一行或多行中的字符的文件。这些行的长度不能超出
2048 个字节(包含所有换行字符),并且其中不能包含空字符。
缺省情况下,uniq 命令比较所有行。如果指定了-f Fields 或 -Fields 标志, uniq 命令忽略由 Fields 变量指定的字段数目。 field 是一个字符串,用一个或多个 空格 字符将它与其它字符串分隔开。
如果指定了 -s Characters 或 -Characters 标志, uniq 命令忽略由 Characters 变量指定的字段数目。为 Fields 和 Characters 变量指定的值必须是正的十进制整数。
当前本地语言环境决定了 -f 标志使用的 空白 字符以及 -s 标志如何将字节解释成字符。
如果执行成功,uniq 命令退出,返回值 0。否则,命令退出返回值大于 0。
标志
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
-f Fields 忽略由 Fields 变量指定的字段数目。如果 Fields 变量的值超过输入行中的字段数目, uniq 命令用空字符串进行比较。这个标志和 -Fields 标志是等价的。
-s Characters
忽略由 Characters 变量指定的字符的数目。如果 Characters 变量的值超过输入行中的字符的数目, uniq
用空字符串进行比较。如果同时指定 -f 和 -s 标志, uniq 命令忽略由 -s Characters 标志指定的字符的数目,而从由 -f
Fields 标志指定的字段后开始。 这个标志和 +Characters 标志是等价的。
-Fields 忽略由 Fields 变量指定的字段数目。这个标志和 -f Fields 标志是等价的。
+Characters
忽略由 Characters 变量指定的字符的数目。如果同时指定 - Fields 和 +Characters 标志, uniq 命令忽略由
+Characters 标志指定的字符数目,并从由 -Fields 标志指定的字段后开始。 这个标志和 -s Characters
标志是等价的。
- c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。
- d 只显示重复行 。
- u 只显示文件中不重复的各行 。
- n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+ n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
- f n 与- n相同,这里n是字段数。
- s n 与+n相同,这里n是字符数。
退出状态
该命令返回以下退出值:
0 命令运行成功。
0 发生错误。
补充
文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样
示例
要删除名为 fruit 文件中的重复行并将其保存到一个名为 newfruit 的文件中,输入:
uniq fruit newfruit
如果 fruit 文件包含下列行:
apples
apples
peaches
pears
bananas
cherries
cherries
则在您运行uniq 命令后 newfruit 文件将包含下列行:
apples
peaches
pears
bananas
cherries
文件/usr/bin/uniq 包含 uniq 命令。
# uniq -c 的用法,例如:
harley
casely
weedly
harley
linda
#cut -c 1-8 | sort | uniq -c result.txt
1 casely
2 harley
1 linda
1 weekly
1. 显示文件example中不重复的行。
uniq - u example
2. 显示文件example中不重复的行,从第2个字段的第2个字符开始做比较。
uniq - u - 1 +1 example
wk肯定行
这是一个cu的精华帖,差不多,对于你的问题你给稍等我修改一下。(ps感谢红袖添香大姐)
CU精华 经典回顾
#假设我有如下文件:
#cat aa
#123 def1 456
#345 def2 812
#123 def3 563
#322 def4 684
#123 def5 879
#......................
#现在我想把第一列中字段相同的合并,第一列不相同的则保留,合并的原则就是保留第一个出现的前两个字段,第三个字段则把结果相加,以上面的示例为例:
#
#就是对于123开头的需要合并,合并后应该成为如下:
#cat aa
#123 def1 1898
#345 def2 812
#322 def4 684
#请问用shell如何实现?
#希望各位帮助!,谢谢!!
#要求总结:
#1 合并相同的第一列数据,并且计算第三列和
#2 第二列只保留第一次出现
#3 第一列顺序不变
觉得这个问题很经典,所以从CU论坛转过来了。
请大家一起学习
我们站在巨人的肩膀上。
问题补充:
看不太懂实现可以讲一下思路吗?
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
我是这样做的
--------------------------2
谢谢你的补充, 已经明白了你对split的适用技巧,是用split(a[$1],tmp)在碰到匹配的$1时取出以前的统计结然后再用$3加上以前的结果是吧,很巧妙。谢谢
但是有2个问题:
1不满足 第二列保留第一次出现记录(现在是保留最后一次出现)
2不满足 第一列按照原来文件顺序出现
看看这个
awk 'BEING
{
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
if($1 in ind)next
ind[$1]
key[n]=$1
n++
}
END{
for(i in key)print key[i],b[key[i]],a[key[i]]
}' filename
#######################
#######################
#######################
这样就行了
#!/bin/bash
awk 'BEGIN
{
if($0 in a)next
a[$0]
b[n]=$0
n++
}
END{
for(i in b)print b[i]
}' data
前提是你的数据文件里面每行没有空格,如果有用-F设定一个没有的字符作分隔符就
Linux下常用文本处理命令大全
Linux下面有很多经典的非常有用的命令,其中处理文本的命令就有很多。下面就让我们一起看看这些经典的Linux文本处理命令有哪些吧。
一. sort
文件排序, 通常用在管道中当过滤器来使用. 这个命令可以依据指定的关键字或指定的字符位置, 对文件行进行排序. 使用-m选项, 它将会合并预排序的输入文件. 想了解这个命令的全部参数请参考这个命令的info页.
二. tsort
拓扑排序, 读取以空格分隔的有序对, 并且依靠输入模式进行排序.
三. uniq
这个过滤器将会删除一个已排序文件中的重复行. 这个命令经常出现在sort命令的管道后边.
四. expand, unexpand
expand命令将会把每个tab转化为一个空格. 这个命令经常用在管道中.
unexpand命令将会把每个空格转化为一个tab. 效果与expand命令相反.
五. cut
一个从文件中提取特定域的工具. 这个命令与awk中使用的print $N命令很相似, 但是更受限. 在脚本中使用cut命令会比使用awk命令来得容易一些. 最重要的选项就是-d(字段定界符)和-f(域分隔符)选项.
六. paste
将多个文件, 以每个文件一列的形式合并到一个文件中, 合并后文件中的每一列就是原来的一个文件. 与cut结合使用, 经常用于创建系统log文件.
七. join
这个命令与paste命令属于同类命令. 但是它能够完成某些特殊的目地. 这个强力工具能够以一种特殊的形式来合并两个文件, 这种特殊的形式本质上就是一个关联数据库的简单版本.
join命令只能够操作两个文件. 它可以将那些具有特定标记域(通常是一个数字标签)的行合并起来, 并且将结果输出到stdout. 被加入的文件应该事先根据标记域进行排序以便于能够正确的匹配.
八. head
把文件的头部内容打印到stdout上(默认为10行, 可以自己修改). 这个命令有一些比较有趣的选项.
九. tail
将一个文件结尾部分的内容输出到stdout中(默认为10行). 通常用来跟踪一个系统logfile的.修改情况, 如果使用-f选项的话, 这个命令将会继续显示添加到文件中的行.
十. wc
wc可以统计文件或I/O流中的”单词数量”:
十一. fold
将输入按照指定宽度进行折行. 这里有一个非常有用的选项-s, 这个选项可以使用空格进行断行(译者: 事实上只有外文才需要使用空格断行, 中文是不需要的)(请参考例子 12-23和例子 A-1).
十二. fmt
一个简单的文件格式器, 通常用在管道中, 将一个比较长的文本行输出进行”折行”.
十三. col
这个命令用来滤除标准输入的反向换行符号. 这个工具还可以将空白用等价的tab来替换. col工具最主要的应用还是从特定的文本处理工具中过滤输出, 比如groff和tbl. (译者: 主要用来将man页转化为文本.)
十四. column
列格式化工具. 通过在合适的位置插入tab, 这个过滤工具会将列类型的文本转化为”易于打印”的表格式进行输出.
十五. colrm
列删除过滤器. 这个工具将会从文件中删除指定的列(列中的字符串)并且写到文件中, 如果指定的列不存在, 那么就回到stdout. colrm 2 4 filename将会删除filename文件中每行的第2到第4列之间的所有字符. p="" /filename将会删除filename文件中每行的第2到第4列之间的所有字符.
Caution: 如果这个文件包含tab和不可打印字符, 那将会引起不可预期的行为. 在这种情况下, 应该通过管道的手段使用expand和unexpand来预处理colrm.
十六. nl
计算行号过滤器. nl filename将会把filename文件的所有内容都输出到stdout上, 但是会在每个非空行的前面加上连续的行号. 如果没有filename参数, 那么就操作stdin.
nl命令的输出与cat -n非常相似, 然而, 默认情况下nl不会列出空行.
十七. pr
格式化打印过滤器. 这个命令会将文件(或stdout)分页, 将它们分成合适的小块以便于硬拷贝打印或者在屏幕上浏览. 使用这个命令的不同的参数可以完成好多任务, 比如对行和列的操作, 加入行, 设置页边, 计算行号, 添加页眉, 合并文件等等. pr命令集合了许多命令的功能, 比如nl, paste, fold, column, 和expand.
pr -o 5 –width=65 fileZZZ | more 这个命令对fileZZZ进行了比较好的分页, 并且打印到屏幕上. 文件的缩进被设置为5, 总宽度设置为65.
一个非常有用的选项-d, 强制隔行打印(与sed -G效果相同).
十八. gettext
GNU gettext包是专门用来将程序的输出翻译或者本地化为不同国家语言的工具集. 在最开始的时候仅仅支持C语言, 现在已经支持了相当数量的其它程序语言和脚本语言.
想要查看gettext程序如何在shell脚本中使用. 请参考info页.
十九. msgfmt
一个产生二进制消息目录的程序. 这个命令主要用来本地化.
二十. iconv
一个可以将文件转化为不同编码格式(字符集)的工具. 这个命令主要用来本地化.
二十一. recode
可以认为这个命令是上边iconv命令的专业版本. 这个非常灵活的并可以把整个文件都转换为不同编码格式的工具并不是Linux标准安装的一部分.
二十二. TeX, gs
TeX和Postscript都是文本标记语言, 用来对打印和格式化的视频显示进行预拷贝.
TeX是Donald Knuth精心制作的排版系统. 通常情况下, 通过编写脚本的手段来把所有的选项和参数封装起来一起传到标记语言中是一件很方便的事情.
用uniq,如下,将 1.txt 中 所有 "相邻" 重复行合并成一行,结果存入 2.txt
uniq 1.txt 2.txt
如果是想将相邻重复行彻底删掉(而不是合并成一行),可以用
uniq -u 1.txt 2.txt
通常如果我们想获取一个文件里不重复的行的时候,我们可以直接通过 sort -u 命令,先把文件排序,然后去掉连续的重复行就行。
可是,如果我们去掉重复行之后,还想保留文件原有的顺序,该怎么办呢?
虽然 Linux 下有个看上去似乎很有用的命令叫uniq,但事实上 uniq 命令仅仅只对连续的重复行有效。
如果不排序,直接使用 uniq 命令是没有用的;使用 sort -u 的话,我们就丢失了文件原有的行的顺序了。
一个终极的解决方案是使用 awk:
简要解释一下:awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行。
我们这里写的 awk 命令是!x[$0]++,意思是,首先创建一个 map 叫x,然后用当前行的全文$0作为 map 的 key,到 map 中查找相应的 value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。
由于表达式之后有++,因此如果某个 key 找不到对应的 value,该++操作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了。
我们前面说过,awk 的流程是先判断表达式,表达式为真的时候就执行语句,可是我们前面写的这个 awk 命令里只有表达式,没有语句,那我们执行什么呢?原来,当语句被省略的时候,awk 就执行默认的语句,即打印整个完整的当前行。就这样,我们通过这个非常简短的 awk 命令实现了去除重复行并保留原有文件顺序的功能。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流