本节来介绍一些Pig常用的数据分析命令.
①load命令
load命令用来加载数据到指定的表结构,语法格式如下:
load '数据文件' [using PigStorage("分隔符")] as (表结构);
注意:默认分隔符是制表符Tab,如果数据文件不是以Tab分割的,必须指定分隔符,否则加载数据失败.例如:
A = load 'a.txt' as (id:int,name:chararray);
B = load 'b.txt' using PigStorage(",") as (id:int,name:chararray);
注意:等号=两边必须有空格,否则容易出错.
describe命令用于查看表结构,语法格式如下:
describe 表名;
例如:
describe A;
group命令用来将数据分组,语法格式如下:
group 表名 by 字段名
C = group A by id;
foreach命令用来对数据集进行迭代处理,语法格式如下:
foreach 表名 generate 字段列表
C = foreach A generate id,name;
也可以使用$0类似的命令来获取数据集中的数据:
C = foreach A generate 1;
filter命令用来过滤数据,语法格式如下:
filter A by 过滤条件
D = filter A by id == 'zs';
常用的条件表达式有:==, !=, =, =, ,
join命令用来连接两张表,语法格式如下:
内连接:join A by id,B by id;
外连接:
左外连接:join A by id left outer,B by id;
右外连接:join A by id right outer,B by id;
全外连接:join A by id full outer,B by id;
limit命令用于取出有限大小的数据集,语法格式如下:
limit 表名 大小
例如:取出A中的前10条数据赋给B
B = limit A 10;
order命令用来对数据集按照指定字段排序,语法格式如下:
order 表名 by 字段列表 [desc]
默认是正序排列,如需倒序在最后加上desc.例如:
B = order A by id;
B = order A by id desc, name desc;
split命令用来根据条件切分数据集,语法格式如下:
①.0.union命令
union命令用来合并两个数据集,语法格式如下:
C = union A, B;
注意:union要求这两个数据集的结构一样,或者能隐式转换成一样,否则操作失败.
①.1.exec命令
exec命令用于执行pig脚本,语法格式如下:
exec [-param param_name=param_value] [-param_file file_name] [script];
示例1:显示和运行脚本
grunt cat myscript.pig;
a = LOAD 'student' AS (name, age, gpa);
DUMP b;
grunt exec myscript.pig;
b = ORDER a BY name;
STORE b into '$out';
grunt exec –param out=myoutput myscript.pig;
run命令也是用来执行pig脚本的,语法格式如下:
run [-param param_name=param_value] [-param_file file_name] script;
c = LIMIT b 10;
grunt a = LOAD 'student' AS (name, age, gpa);
grunt run myscript.pig;
grunt DUMP d;
grunt run –param out=myoutput myscript.pig;
set命令用于给key设置值,语法格式如下:
set key 'value';
set name 'xiaoming';
kill命令用于杀死进程,语法格式如下:
kill jobid;
help命令用于列出pig命令及属性,格式如下:
-help [properties]
quit命令用于退出Grunt Shell环境,格式如下:
quit;
clear命令用来清屏,语法格式如下:
clear;
history命令用来查看执行命令记录,语法格式如下:
history;
distinct命令用来删除数据集中的重复项,语法格式如下:
distinct 表名;
B = distinct A;
dump命令用来将结果数据集显示到屏幕上,格式如下:
dump 表名;
dump A;
store命令用于将结果数据集保存到文件中,格式如下:
store 表名 into '文件路径' [using PigStorage('分隔符')];
store A into '/pig/output/A.txt';
store A into '/pig/output/A.txt' using PigStorage(',');
store命令与load命令一样,默认分隔符为Tab,如需更改分隔符,需要手动指定.
总结
常用的Pig命令就是以上这些了,在执行Pig命令时,需要注意以下几点内容:
PigLatin语句末尾一定要加分号【;】.
Pig对命令的大小写没有规定,可以使用大写,也可以小写.
Pig中的函数就必须使用大写,因为这些函数在pig中定义的时候就是大写.
针对Pig处理过程中的临时变量的名称,大小写也是有区分的.
在pig中执行的命令其实并不会真正的执行,只有当执行dump或者store命令的时候才会真正指定之前定义的命令.
如果某一条命令执行失败了,那么只需要修改这条命令,重新执行即可.
Linux 操作系统最大的一个好处是它带有各种各样的实用工具.存在如此之多不同的实用工具,几乎不可能知道并了解所有这些工具.可以简化关键情况下操作的一个实用 工具是 sed.它是任何管理员的工具包中最强大的工具之一,并且可以证明它自己在关键情况下非常有价值.
sed 的工作方式
sed 实用工具按顺序逐行将文件读入到内存中.然后,它执行为该行指定的所有操作,并在完成请求的修改之后将该行放回到内存中,以将其转储至终端.完成了这一行 上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件.如同前面所提到的,默认输出是将每一行的内容输出到屏幕上.今天这一节,开始涉及到 两个重要的因素—首先,输出可以被重定向到另一文件中,以保存变化;第二,源文件(默认地)保持不被修改.sed 默认读取整个文件并对其中的每一行进行修改.不过,可以按需要将操作限制在指定的行上.
该实用工具的语法为:
sed [options] '{command}' [filename]
在这篇文章中,我们将浏览最常用的命令和选项,并演示它们如何工作,以及它们适于在何处使用.
替换命令
's/{old value}/{new value}/'
因而,下面演示了如何非常简单地将 "tiger" 修改为 "wolf":
$ echo The tiger cubs will meet on Tuesday after school | sed
's/tiger/wolf/'
The wolf cubs will meet on Tuesday after school
$
注意如果输入是源自之前的命令输出,则不需要指定文件名—同样的原则也适用于 awk、sort 和其它大多数 LinuxUNIX 命令行实用工具程序.
多次修改
$ echo The tiger cubs will meet on Tuesday after school | sed -e '
s/tiger/wolf/' -e 's/after/before/'
The wolf cubs will meet on Tuesday before school
这是实现它的非常复杂的方法,所以呢 "-e" 选项不常被大范围使用.更好的方法是用分号来分隔命令:
$ echo The tiger cubs will meet on Tuesday after school | sed '
s/tiger/wolf/; s/after/before/'
注 意分号必须是紧跟斜线之后的下一个字符.如果两者之间有一个空格,操作将不能成功完成,并返回一条错误消息.这两种方法都很好,但许多管理员更喜欢另一种 方法.要注意的一个关键问题是,两个撇号 (' ') 之间的全部内容都被解释为 sed 命令.直到您输入了第二个撇号,读入这些命令的 shell 程序才会认为您完成了输入.这意味着可以在多行上输入命令—同时 Linux 将提示符从 PS1 变为一个延续提示符(通常为 "")—直到输入了第二个撇号.一旦输入了第二个撇号,并且按下了 Enter 键,则处理就进行并产生相同的结果,如下所示:
s/tiger/wolf/
s/after/before/'
全局修改
$ echo The tiger cubs will meet this Tuesday at the same time
as the meeting last Tuesday | sed 's/Tuesday/Thursday/'
The tiger cubs will meet this Thursday at the same time
as the meeting last Tuesday
as the meeting last Tuesday | sed 's/Tuesday/Thursday/g'
as the meeting last Thursday
请记住不管您要查找的序列是否仅包含一个字符或词组,这种对全局化的要求都是必需的.
sed 还可以用来修改记录字段分隔符.例如,以下命令将把所有的 tab 修改为空格:
sed 's// /g'
其 中,第一组斜线之间的项目是一个 tab,而第二组斜线之间的项目是一个空格.作为一条通用的规则,sed 可以用来将任意的可打印字符修改为任意其它的可打印字符.如果您想将不可打印字符修改为可打印字符—例如,铃铛修改为单词 "bell"—sed 不是适于完成这项工作的工具(但 tr 是).
有时,您不想修改在一个文件中出现的所有指定项目.有时,您只想在满足某些条件时才作修改—例如,在与其它一些数据匹配之后才作修改.为了说明这一点,请考虑以下文本文件:
$ cat sample_one
one 1
two 1
three 1
现在,使其更加准确:
$ sed '
请 再次记住唯一改变了的是显示.如果您查看源文件,您将发现它始终保持不变.您必须将输出保存至另一个文件,以实现永久保存.值得重复的是,不对源文件作修 改实际是祸中有福—它让您能够对文件进行试验而不会造成任何实际的损害,直到让正确命令以您预期和希望的方式进行工作.
以下命令将修改后的输出保存至一个新的文件:
该输出文件将所有修改合并在其中,并且这些修改通常将在屏幕上显示.现在可以用 head、cat 或任意其它类似的实用工具来进行查看.
脚本文件
sed 工具允许您创建一个脚本文件,其中包含从该文件而不是在命令行进行处理的命令,并且 sed 工具通过 "-f" 选项来引用.通过创建一个脚本文件,您能够一次又一次地重复运行相同的操作,并指定比每次希望从命令行进行处理的操作详细得多的操作.
考虑以下脚本文件:
$ cat sedlist
现在可以在数据文件上使用脚本文件,获得和我们之前看到的相同的结果:
$ sed -f sedlist sample_one
限制行
在这种情况下,因为要修改的行是专门指定的,所以不需要替换命令.所以呢,您可以灵活地根据匹配准则(可以是行号或一种匹配模式)来选择要修改哪些行(从根本上限制修改).
禁止显示
$ sed -n -f sedlist sample_one
$ sed -n -f sedlist sample_one sample_two
$ cat sample_two
然后下面是运行它的结果:
删除行
该命令的语法是:
'{what to find} d'
从 sample_one 文件中删除包含 "two" 的所有行:
$ sed '/two/ d' sample_one
从显示屏中删除前三行,而不管它们的内容是什么:
上三角号 (^) 表示一行的开始,所以呢,如果 "two" 是该行的头三个字符,则
sed '/^two/ d' sample_one
将只删除该行.
美元符号 ($) 代表文件的结尾,或一行的结尾,所以呢,如果 "two" 是该行的最后三个字符,则
sed '/two$/ d' sample_one
将这两者结合在一起的结果:
sed '/^$/ d' {filename}
其通常的用途是删除一个标题.以下命令将删除文件中所有的行,从第一行直到第一个空行:
sed '1,/^$/ d' {filename}
添加和插入文本
可以结合使用 sed 和 "a" 选项将文本添加到一个文件的末尾.实现方法如下:
$ sed '$a
This is where we stop
the test' sample_one
the test
在该命令中,美元符号 ($) 表示文本将被添加到文件的末尾.反斜线 () 是必需的,它表示将插入一个回车符.如果它们被遗漏了,则将导致一个错误,显示该命令是错乱的;在任何要输入回车的地方您必须使用反斜线.
新的文本出现在输出的中间位置,而处理通常在指定的操作执行以后继续进行.
读写文件
$ cat sample_three
修改命令
除了替换项目之外,还可以将行从一个值修改为另一个值.要记住的是,替换是对字符逐个进行,而修改功能与删除类似,它影响整行:
$ sed '/two/ c
We are no longer using two' sample_one
We are no longer using two
修改全部但......
对于大多数 sed 命令,详细说明各种功能要进行何种修改.利用感叹号,可以在除指定位置之外的任何地方执行修改—与默认的操作完全相反.
例如,要删除包含单词 "two" 的所有行,操作为:
而要删除除包含单词 "two" 的行之外的所有行,则语法变为:
$ sed '/two/ !d' sample_one
如果您有一个文件包含一系列项目,并且想对文件中的每个项目执行一个操作,那么首先对那些项目进行一次智能扫描并考虑将要做什么是很重要的.为了使事情变得更简单,您可以将 sed 与任意迭代例程(for、while、until)结合来实现这一目的.
比如说,假定您有一个名为 "animals" 的文件,其中包含以下项目:
pig
horse
elephant
cow
dog
cat
您希望运行以下例程:
#mcd.ksh
for I in $*
do
echo Old McDonald had a $I
echo E-I, E-I-O
done
结 果将为,每一行都显示在 "Old McDonald has a" 的末尾.虽然对于这些项目的大部分这是正确的,但对于 "elephant" 项目,它有语法错误,因为结果应当为 "an elephant" 而不是 "a elephant".利用 sed,您可以在来自 shell 文件的输出中检查这种语法错误,并通过首先创建一个命令文件来即时地更正它们:
#sublist
/ a a/ s/ a / an /
/ a e/ s/ a / an /
/a i/ s / a / an /
/a o/ s/ a / an /
/a u/ s/ a / an /
然后执行以下过程:
$ sh mcd.ksh 'cat animals' | sed -f sublist
Old McDonald had a pig
E-I, E-I-O
Old McDonald had a horse
Old McDonald had an elephant
Old McDonald had a cow
Old McDonald had a dog
Old McDonald had a cat
提前退出
sed 默认读取整个文件,并只在到达末尾时才停止.不过,您可以使用退出命令提前停止处理.只能指定一条退出命令,而处理将一直持续直到满足调用退出命令的条件.
例如,仅在文件的前五行上执行替换,然后退出:
在退出命令之前的项目可以是一个行号(如上所示),或者一条查找/匹配命令:
/three/q' sample_one
sed 110q filename
处理问题
如果您的操作顺序没有十分彻底地考虑清楚,那么这可能会很麻烦.例如,假定您需要将所有的 "two" 项目修改为 "three",然后将所有的 "three" 修改为 "four":
/two/ s/two/three/
/three/ s/three/four/' sample_one
four 1
当执行这种操作时,您必须非常用心地注意指定操作的方式,并按某种顺序来安排它们,使得操作之间不会互相影响.例如:
/three/ s/three/four/
/two/ s/two/three/' sample_one
这非常有效,因为 "three" 值在 "two" 变成 "three" 之前得到修改.
标签和注释
可以在 sed 脚本文件中放置标签,这样一旦文件变得庞大,可以更容易地说明正在发生的事情.存在各种各样与这些标签相关的命令,它们包括:
此时此刻呢的步骤
访问并收藏 Linux 技术中心
: 冒号表示一个标签名称.例如:
:HERE
以冒号开始的标签可以由 "b" 和 "t" 命令处理.
b {label} 充当 "goto" 语句的作用,将处理发送至前面有一个冒号的标签.例如,
b HERE
将处理发送给行
如果紧跟 b 之后没有指定任何标签,则处理转至脚本文件的末尾.
t {label} 只要自上次输入行或执行一次 "t" 命令以来进行了替换操作,就转至该标签.和 "b" 一样,如果没有给定标签名,则处理转至脚本文件的末尾.
# 符号作为一行的第一个字符将使整行被当作注释处理.注释行与标签不同,不能使用 b 或 t 命令来转到注释行上.
在linux中我们删除文件可以直接使用rm命令来删除哦,小编今天给大家介绍介绍在linux 删除文件和目录及误删除之后文件恢复方法,有需要了解的同学可参考.
前面你已经学习了使用 touch 命令来创建文件,以及使用 mkdir 命令来创建目录 tigger.
现在,你需要学习如何删除文件和目录. 使用 rm 命令来删除文件和目录是一个直截了当的过程.详情请参阅 rm 的说明书页.删除文件和目录的选项包括:
-i — 互动.提示你确认删除.这个选项可以帮助你避免误删文件.
-f — 强制.代替互动模式,不提示地删除文件.除非你知道自己在干什么,使用这个选项通常不是明智之举.
-v — 详细.显示文件的删除进度.
-r — 递归.将会删除某个目录及其中所有的文件和子目录.
要使用 rm 命令来删除文件 piglet.txt,键入:
rm piglet.txt
警告
一旦文件或目录使用 rm 命令删除后,它就一去不复返了.
使用 -i(互动)选项会再给你一次机会来决定你是否真的想删除该文件.
rm -i piglet.txt
rm: 是否删除一般文件'piglet.txt'?
你还可以使用通配符"*"来删除文件,不过,你必须谨慎而为,因为它很容易删除你并不想删除的文件.
要使用通配符来删除文件,可以键入:
rm pig*
上面的命令会删除目录中所有起首为 pig 字母的文件.
你还可以使用 rm 命令来删除多个文件. 例如:
rm piglet.txt sneakers.txt
你可以使用 rmdir 来删除目录( 如:rmdir foo),但是目录必须是空目录.要使用 rm 来删除目录,你必须指定 -r 选项.
譬如,如果你想递归地删除目录 tigger,你可以键入:
rm -r tigger
如果你想组合选项,例如强制一种递归的删除,你可以键入:
rm -rf tigger
另一个比使用 rm 更安全的删除目录的命令是 rmdir 命令.这个命令不允许你使用递归删除,所以呢不能删除包含文件的目录.
rm 命令可以删除你的整个文件系统!如果你登录为根用户,然后键入这个简单命令: rm -rf /,你的麻烦就大了;这个命令会递归地删除你的系统上的一切.
阅读 rmdir 的说明书页( man rmdir)来获取关于这个命令的详细信息
Linux 文件误删除恢复操作
第一段:用运SecureCRT远程对操作系统上,查看一下当前系统版本号,及文件系统格式
第二段:为方便本次实验,我们新创建一文件.
第三段:执行删除操作,
第四段:运用,系统自还工具debugfs来修复
第五段:打开,刚刚被删除文件所在的分区
第六段:用ls 加-d参数显示刚刚删除文件所在的目录
八,执行完命令后,显示了一屏信息,我们需要的是下面这一行,并且要记住,后面的值
九,退出debugfs
十,执行如下命令
十一,以上结果表示恢复成功我们看下/tmp目录下到底有没有
十二,tmp目录下有我们显示一下,
linux下删除乱码文件
根据inode 来修改或删除linux 下乱码的文件
① 创建测试文件:
touch 1?.txt
....
所以呢,有必要彻底地了解其应用