20,文本处理

paste

https://www.unix.com/shell-programming-and-scripting/161826-how-combine-2-files-into-1-file-2-columns.html

将文件按列合并。

例如:

inputfile1.txt

Code:

12345
67890
24580

inputfile2.txt

Code:

AAAAA
BBBBB
CCCCC

DESIRED OUTPUT:
outputfile.txt

Code:

12345     AAAAA
67890     BBBBB
24580     CCCCC
paste inputfile1.txt inputfile2.txt > outputfile.txt

1,cat

-A  可以 显示处理不可打印字符

2, sort

按行排序,可以一次接收多个文件。

-b  --ignore-leading-blanks  sort默认是处理整行,从第一个字符开始,-b可以忽略掉行开头的空白

-f  --ignore-case  忽略大小写

-n  --numeric-sort  按数字大小排序

-r  --reverse  逆序

-k  --key=field1[,field2]  按从field1到field2的key排序,而非整行。排序允许指定多个-k选项,一个-k选项也可以指定一个字段范围,如果没有指定范围,-k从指定的字段开始到行尾作为排序关键字。

-m  --merge  合并多个文件

-o  --output=file  输出到文件

-t  --field-separator=char  定义分隔符,默认是空格和tab

-u  --unique  删掉重复行

例如:ls -l /usr/bin | sort -nrk 5 | head

指定第五个field作为排序关键字。

例如:

sort --key=1,1 --key=2n distros.txt

等效于

sort -k 1,1 -k 2n distros.txt

注意,1,1 不能写成 1

一个选项字母可能被包含在一个键值说明符的末尾,其用来指定排序的种类。这些 选项字母和 sort 程序的全局选项一样:b(忽略开头的空格),n(数值排序),r(逆向排序),等等。

有时候我们遇到的日期是 MM/DD/YYYY 这种写法,但是我们想按照YYYY-MM-DD的顺序排序,那么可以使用这种办法:

[me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt

Fedora 10    11/25/2008

Ubuntu 8.10  10/30/2008

SUSE 11.0  06/19/2008

 

-k 3.7 ,意思是:从第3field的第7个字符开始作为sort的关键字排序。

3,uniq

uniq仅删除临近重复的行。

一般跟sort连用,sort -u 可以支持uniq功能。

4, cut

从文本行截取一部分输出到标准输出。

-c list  --characters=list  截取list定义的部分,数字范围之间用逗号分隔,范围内的数字用减号分隔,例如:cut -c 7-10

-f list  --fields=list  截取list定义的fields,list可以包含一个或多个fields,或者用逗号分隔的field范围。例如:cut -f 3

-d delim  --delimeter=delim  配合-f指定field分隔符,默认是单个tab键。

5,paste

拼接列。

6, join

将多个文件的列基于相同的field进行合并。

ps,相同的field顺序要一致,只合并field值相同的行,拿空白符作为输入间隔,拿空格作为输出间隔。

7,tr

transliterate characters,字符转换。接受标准输入,结果呈现在标准输出。

[me@linuxbox ~]$ echo "lowercase letters" | tr a-z A-Z

LOWERCASE LETTERS

 

字符集可以是以下3种写法:

1,枚举型,例如:ABCDEFGHIJKLMNOPQRSTUVWXYZ

2,字符范围。例如:A-Z

3,POSIX字符集,例如:[:upper:]。

 

-s squeeze, 删除相邻的重复字符。例如:

echo "aaabbbccc" | tr -s ab

[me@linuxbox ~]$ echo "abcabcabc" | tr -s ab

abcabcabc

8,sed

stream editor.

echo "front" | sed 's/front/back/'     斜线/是分隔符,分隔符可以任选,斜线是常用的,事实上,紧跟着命令后面的任何字符都会被认为是分隔符,比如:echo "front" | sed 's_front_back_'。

地址符:

n    行号

$    最后一行

/regexp/    匹配POSIX基础正则表达式的行,

addr1,addr2    从addr1到addr2的行

first~step    匹配数字first行,然后每间隔step行。例如:1~2 所以的奇数行,5~5第五行和其后的每个第五行。

addr1,+n    addr1和其后的n行

addr!    除了addr之外的所有行。addr可以是以上任一种地址符

基本的编辑命令:

=  输出当前行号

a  当前行后面append文本

d  Delete 当前行

i   在当前行前面insert文本

p  打印当前行。默认sed打印所有行,编辑匹配行。默认行为可以用-n选项覆盖。

Q  Exit sed

s/regexp/replacement/  替换。在replacement中,&表示regexp匹配到的文本,\1到\9是反向引用,表示regexp中相应的子表达式。

y/set1/set2   将set1里的字符集转换成set2里边的字符集,跟tr不一样,sed要求set1 set2等长。也不支持字符范围,例如[a-z],也不支持POSIX character classes。

sed -i 's/lazy/laxy/; s/jumped/jimped/' foo.txt   用;分隔

修正符

g   globally to a line,而不仅仅是第一次。

选项

-n  抑制自动打印

-f  将多个命令放到一个文件中。例如:

distros.sed:

# sed script to produce Linux distributions report
1 i\
\
Linux Distributions Report\
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

 

[me@linuxbox ~]$ sed -f distros.sed distros.txt

Linux Distributions Report

SUSE 10.2  2006-12-07
FEDORA 10  2008-11-25

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值