如何在命令行中整理数据 | Linux 中国

如何在命令行中整理数据 | Linux 中国
命令行审计不会影响数据库,因为它使用从数据库中释放的数据。-- Bob Mesibov

有用的原文链接请访问文末的“

原文链接

”获得可点击的文内链接、全尺寸原图和相关文章。致谢

编译自 | http://opensource.com/article/18/5/command-line- src="http://img5.shadafang.com/img.php?http://mmbiz.qpic.cn/mmbiz_jpg/W9DqKgFsc68qwiccyQqqRwtpEKJtQugjaPbxjZI4G9sLf4MujysAePK6iaxnASzI6Smg50huFBMlU3wBJ2mpiaRtQ/640?wx_fmt=jpeg" title="Tshirt, Keep Calm and Open A Terminal" />

Tshirt, Keep Calm and Open A Terminal

例子

假设我想在一个大的表中的特定字段中找到最长的数据项。 这不是一个真正的数据审计任务,但它会显示 shell 工具的工作方式。 为了演示目的,我将使用制表符分隔的表 full0 ,它有 1,122,023 条记录(加上一个标题行)和 49 个字段,我会查看 36 号字段。(我得到字段编号的函数在我的

网站

[8]

上有解释)

首先,使用 tail 命令从表 full0 移除标题行,结果管道至 cut 命令,截取第 36 个字段,接下来,管道至 awk ,这里有一个初始化为 0 的变量 big ,然后 awk 开始检测第一行数据项的长度,如果长度大于 0 ,awk 将会设置 big 变量为新的长度,同时存储行数到变量 line 中。整个数据项存储在变量 text 中。然后 awk 开始轮流处理剩余的 1,122,022 记录项。同时,如果发现更长的数据项时,更新 3 个变量。最后,它打印出行号、数据项的长度,以及最长数据项的内容。(在下面的代码中,为了清晰起见,将代码分为几行)

  • tail

    -

    n

    +

    2

    full0 \

  • >

    |

    cut

    -

    f36 \

  • >

    |

    awk

    "BEGIN {big=0} length($0)>big \

  • > {big=length($0);line=NR;text=$0} \

  • > END {print "\nline: "line"\nlength: "big"\ntext: "text}"

  • 大约花了多长时间?我的电脑大约用了 4 秒钟(core i5,8GB RAM);

    如何在命令行中整理数据 | Linux 中国

    现在我可以将这个长长的命令封装成一个 shell 函数,longest,它把第一个参数认为是文件名,第二个参数认为是字段号:

    如何在命令行中整理数据 | Linux 中国

    现在,我可以以函数的方式重新运行这个命令,在另一个文件中的另一个字段中找最长的数据项,而不需要去记忆这个命令是如何写的:

    如何在命令行中整理数据 | Linux 中国

    最后调整一下,我还可以输出我要查询字段的名称,我只需要使用 head 命令抽取表格第一行的标题行,然后将结果管道至 tr 命令,将制表位转换为换行,然后将结果管道至 tail 和 head 命令,打印出第二个参数在列表中名称,第二个参数就是字段号。字段的名字就存储到变量 field 中,然后将它传向 awk ,通过变量 fld 打印出来。(LCTT 译注:按照下面的代码,编号的方式应该是从右向左)

  • longest

    ()

    {

    field

    =

    $

    (

    head

    -

    n

    1

    "$1"

    |

    tr

    "\t"

    "\n"

    |

    tail

    -

    n

    +

    "$2"

    |

    head

    -

    n

    1

    );

    \

  • tail

    -

    n

    +

    2

    "$1"

    \

  • |

    cut

    -

    f

    "$2"

    |

    \

  • awk

    -

    v fld

    =

    "$field"

    "BEGIN {big=0} length($0)>big \

  • {big=length($0);line=NR;text=$0}

  • END {print "\nfield: "fld"\nline: "line"\nlength: "big"\ntext: "text}"

    ;

    }

  • 如何在命令行中整理数据 | Linux 中国

    注意,如果我在多个不同的字段中查找最长的数据项,我所要做的就是按向上箭头来获得最后一个最长的命令,然后删除字段号并输入一个新的。

    via: 

    http://opensource.com/article/18/5/command-line-data-auditing

    作者:

    Bob Mesibov

    [10]

     选题:

    lujun9972

     译者:

    amwps290

     校对:

    wxy

    本文由 

    LCTT

     原创编译,

    Linux中国

     荣誉推出