cut命令学习

如果你经常和数据打交道,那么你肯定会经常需要对列进行操作。在 Linux 中,对纯文本文件的列操作有两个十分有用的命令:cutpaste。其中 cut 主要用于从纯文本文件中取出某些列,paste 则可以用于按列合并。

cut 命令
假设有这样一个测试文件 cut.txt:

1|2|3|4|5|6|7|8|九|0
1|2|3|4|5|6|7|8|九|0
1|2|3|4|5|6|7|8|九|0
1|2|3|4|5|6|7|8|九|0
1|2|3|4|5|6|7|8|九|0
1|2|3|4|5|6|7|8|九|0

我们将用这个测试文件来做一些实验。

cut 基础与字节模式
前面说过,cut 命令的本职工作就是取出某些列。实际上,更准确地说法,是 cut 命令逐行地处理输入,并从中取出某些列。这里说的「列」有三种模式:

-b      # 以字节作为标准取出列
-c      # 以字符作为标准取出列
-f      # 以域 (field) 作为标准取出列

首先我们看看字节模式。比如我们可以取出每一行的第三个字节中的内容。我们知道,英文字符都是以 ASCII 编码用一个字符保存的。这样,我们预期会输出 6 个 2。我们来看下实际的输出。

$ cut -b 3 cut.txt
2
2
2
2
2
2

完美,完全符合预期!

我们来看一下 cut 命令的样式

1
cut -[b,c,f] <columns> <filename>
在刚才的例子中,我们选择了字节模式(-b),并指定了第三列。值得一提的是,cut 命令的列指定风格非常的灵活。

3       # 第三列
3,5,8   # 第三列、第五列、第八列
3-5,8   # 第三列至第五列、第八列
-3,8    # 第一列至第三列、第八列
1,3-    # 第一列、第三列至最后一列

字节模式在某些情况会遇到问题。比如,遇到非 ASCII 编码的字符时(特别是多字节字符),就会遇到问题。我们试着看看用 -b 模式输出第 17 列会怎样。

$ cut -b 17 cut.txt

实际上,-b 模式的第 17 列,会输出「九」的第一个字节。具体输出的内容取决于系统使用的编码。如果我们想输出字符「九」就需要使用字符模式了。

字符模式与域模式
-c 是字符模式。为了输出一列汉字「九」,我们可以这样

$ cut -c 17 cut.txt
九
九
九
九
九
九

除了解析列的方式不一样之外,-c 和 -b 完全一样。

类似的,还有域模式。与字节模式以及字符模式最大的不同是,域模式可以指定单个字符作为分隔符,逐行地将文件分成若干列。比如,这里我们可以用 | 作为分隔符,输出第三列至第五列以及第九列。注意,在列模式下,分隔符也会按需输出。

$ cut -d '|' -f 3-5,9 cut.txt
3|4|5|九
3|4|5|九
3|4|5|九
3|4|5|九
3|4|5|九
3|4|5|九

补集
cut 命令还支持 --complement 参数,意思是取补集。比如在我们刚才的例子中,取补集就意味着取出第一列、第二列、第六列至第八列以及第十列。

$ cut -d '|' -f 3-5,9 --complement cut.txt
1|2|6|7|8|0
1|2|6|7|8|0
1|2|6|7|8|0
1|2|6|7|8|0
1|2|6|7|8|0
1|2|6|7|8|0

使用 --complement 参数,我们可以很容易地从纯文本中删除某一列。比如我们想删除第四列

$ cut -d '|' -f 4 --complement cut.txt
1|2|3|5|6|7|8|九|0
1|2|3|5|6|7|8|九|0
1|2|3|5|6|7|8|九|0
1|2|3|5|6|7|8|九|0
1|2|3|5|6|7|8|九|0
1|2|3|5|6|7|8|九|0

轻而易举~

一点黑魔法:处理连续空格分割的情况
cut 在处理连续空格分割列的时候,结果就会变得一团糟。不过,好在我们有 tr 命令。使用 -s 参数,可以逐行地将连续的字符 unique 成单独的一个字符。

$ who
Liam :0           2016-11-08 00:07
Liam pts/0        2016-11-08 00:23 (:0.0)
Liam pts/1        2016-11-08 00:15 (:0.0)
$ who | tr -s ' '
Liam :0 2016-11-08 00:07
Liam pts/0 2016-11-08 00:23 (:0.0)
Liam pts/1 2016-11-08 00:15 (:0.0)

这样,我们就能轻易地获得各个用户的登录时间了

$ who | tr -s ' ' | cut -d ' ' -f 1,3,4
Liam 2016-11-08 00:07
Liam 2016-11-08 00:23
Liam 2016-11-08 00:15

paste 命令
基本用法
相比 cut 命令,paste 命令的用法就简单粗暴许多了。

假设我们有三个文件

$ cat paste1.txt  | $ cat paste2.txt | $ cat paste3.txt
1                 | a                | A
2                 | b                | B
3                 | c                | C

现在我们用 paste 试试看

$ paste paste1.txt paste2.txt
1    a
2    b
3    c
$ paste paste2.txt paste1.txt
a    1
b    2
c    3
$ paste paste2.txt paste1.txt paste3.txt
a    1    A
b    2    B
c    3    C
$ paste paste2.txt paste1.txt paste3.txt | sed -n l
a\t1\tA
b\t2\tB
c\t3\tC

不难发现,paste 命令支持输入多个文件,并按顺序将他们用制表符粘在一起。如果你想用其他的分隔符将他们粘在一起,也可以像 cut 命令那样使用 -d 参数指定。

$ paste -d '|' paste2.txt paste1.txt paste3.txt
a|1|A
b|2|B
c|3|C

一点黑魔法:避免使用临时文件
如果我们需要将几个程序的即时输出(标准输出)按列粘在一起的话,可能不得不将这些输出先写入临时文件当中,然后再调用 paste 命令。不过,也有不用这样麻烦的办法——使用 Bash Process Substituation 来解决这个问题。

简单来说,就是使用 <(command) 来「伪装成一个文件」的样子,作为 paste 命令的输入。比如

$ paste -d '|' <(cat paste2.txt) <(cat paste1.txt) <(cat paste3.txt)
a|1|A
b|2|B
c|3|C
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 7,937评论 1 19
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,618评论 0 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,310评论 0 5
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,867评论 0 9
  • 现在写起这篇文章的事情,已经过去了快两年了。也许再不记录下来就要淡忘了。大二的那一年,作为一个满腔热血的青年,我加...
    小行行阅读 264评论 0 1