看看这个:
[seesea@UC ~]$ join -t'|' <(sort -t'|' -k1,1 -r -k5,5 a.txt | uniq -w3 | sort -t'|' -k1,1) <(sort -t'|' -k1,1 b.txt) > c.txt
[seesea@UC ~]$ cat c.txt
123|kkk|jjj|sss|2013-02-21 16:11:07|OFF
135|bbb|ccc|ddd|2013-01-28 16:11:07|ON
456|kkk|jjj|sss|2013-01-28 16:11:07|ON
789|kkk|jjj|sss|2013-02-21 16:11:07|OFF
-------------------
另一个方案:
[seesea@UC ~]$ awk -F'|' 'NR==FNR{b[$1]=$2}; NR!=FNR{a[$1]=$0 OFS b[$1]; ti[$1]=(ti[$1]<$5?$5:ti[$1])}; END{for (i in a){if (a[i]~ti[i]) print a[i]}}' b.txt a.txt > c.txt
[seesea@UC ~]$ cat c.txt
456|kkk|jjj|sss|2013-01-28 16:11:07 ON
123|kkk|jjj|sss|2013-02-21 16:11:07 OFF
135|bbb|ccc|ddd|2013-01-28 16:11:07 ON
789|kkk|jjj|sss|2013-02-21 16:11:07 OFF
-------------------
两方案都破坏原有的顺序,如果你要保持 a.txt 中的顺序,你另外做个排序吧
B. Linux下C++读取文件去重的问题
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
#include<iostream>
#include<sstream>
classdata_t{
public:
data_t():val(5){}
std::string&operator[](intconsti){
returnval[i];
}
std::stringconst&operator[](intconsti)const{
returnval[i];
}
private:
std::vector<std::string>val;
};
template<inti>
structcmp1{//用于sort函数
booloperator()(data_tconst&a,data_tconst&b)const{
returna[i]<b[i];
}
};
template<inti>
structcmp2{//用于unique函数
booloperator()(data_tconst&a,data_tconst&b)const{
returna[i]==b[i];
}
};
intmain(){
std::ifstreamistr("input.txt");
if(!istr){
std::cerr<<"文件打开失败 ";
return__LINE__;
}
typedefstd::vector<data_t>vector_t;
vector_tdata;
//读取文件
std::stringline;
intline_num=0;
while(getline(istr,line)){
++line_num;
data_ttmp_data;
std::istringstreamtmp_str(line);
inti=0;
for(;i!=5;++i){
if(!getline(tmp_str,tmp_data[i],' ')){
std::cerr<<"在第"<<line_num<<"行发生错误 ";
}
}
if(i==5){//该行读取成功
data.push_back(tmp_data);
}
}
//按关键字1去重
std::sort(data.begin(),data.end(),cmp1<0>());
vector_t::iteratorlast=std::unique(data.begin(),data.end(),cmp2<0>());
//按关键字2去重
std::sort(data.begin(),last,cmp1<1>());
last=std::unique(data.begin(),last,cmp2<1>());
data.erase(last,data.end());
//输出到另一个文件
std::ofstreamostr("output.txt");
if(!ostr){
std::cerr<<"文件打开失败 ";
return__LINE__;
}
for(inti=0;i!=data.size();++i){
for(intj=0;j!=5;++j){
ostr<<data[i][j]<<" ";
}
ostr<<" ";
}
return0;
}
输入文件为input.txt,样例:
111222333444555
111222333444555
1111222333444555
1111222333444555
11111222333444555
11111222333444555
输出到output.txt,样例:
111222333444555
C. linux中怎么按条件去重一个文件
cat 文件 | sort | uniq -w1
D. 如何在 Linux 中删除超大的文件
1. 通过重定向到 Null 来清空文件内容
E. Linux json文件(排序|去重)
文件 test.log json文件数据
根据 data.ext.uid 字段排序
使用 jq 去重数据,并只显示 data.ext.uid 字段
多维度去重
F. linux文件行排序去重结果不同sort和uniq
骚年,你有仔细观察者两个命令吗?
举个例子:
文件filea为:
a
b
c
c
d
b
执行sort filea |uniq -u |wc -l,先排序,则删除了伏模c和b的行缺漏缓;
执行sort -u filea |wc -l,排序,同时删除相同搜激的行,则只删除c行。
G. 利用Linux命令行进行文本按行去重并按重复次数排序
利用linux命令行进行文本按行去重并按重复次数排序linux命令行提供了非常强大的文本处理功能,组合利用linux命令能实现好多强大的功能。本文这里举例说明如何利用linux命令行进行文本按行去重并按重复次数排序。主要用到的命令有sort,uniq和cut。其中,sort主要功能是排序,uniq主要功能是实现相邻文本行的去重,cut可以从文本行中提取相应的文本列(简单地说,就是按列操作文本行)。用于演示的测试文件内容如下:[plain]Hello
World.
Apple
and
Nokia.
Hello
World.
I
wanna
buy
an
Apple
device.
The
Iphone
of
Apple
company.
Hello
World.
The
Iphone
of
Apple
company.
My
name
is
Friendfish.
Hello
World.
Apple
and
Nokia.
实现命令及过程如下:[plain]1、文本行去重
(1)排序
由于uniq命令只能对相邻行进行去重复操作,所以在进行去重前,先要对文本行进行排序,使重复行集中到一起。
$
sort
test.txt
Apple
and
Nokia.
Apple
and
Nokia.
Hello
World.
Hello
World.
Hello
World.
Hello
World.
I
wanna
buy
an
Apple
device.
My
name
is
Friendfish.
The
Iphone
of
Apple
company.
The
Iphone
of
Apple
company.
(2)去掉相邻的重复行
$
sort
test.txt
|
uniq
Apple
and
Nokia.
Hello
World.
I
wanna
buy
an
Apple
device.
My
name
is
Friendfish.
The
Iphone
of
Apple
company.
2、文本行去重并按重复次数排序
(1)首先,对文本行进行去重并统计重复次数(uniq命令加-c选项可以实现对重复次数进行统计。)。
$
sort
test.txt
|
uniq
-c
2
Apple
and
Nokia.
4
Hello
World.
1
I
wanna
buy
an
Apple
device.
1
My
name
is
Friendfish.
2
The
Iphone
of
Apple
company.
(2)对文本行按重复次数进行排序。
sort
-n可以识别每行开头的数字,并按其大小对文本行进行排序。默认是按升序排列,如果想要按降序要加-r选项(sort
-rn)。
$
sort
test.txt
|
uniq
-c
|
sort
-rn
4
Hello
World.
2
The
Iphone
of
Apple
company.
2
Apple
and
Nokia.
1
My
name
is
Friendfish.
1
I
wanna
buy
an
Apple
device.
(3)每行前面的删除重复次数。
cut命令可以按列操作文本行。可以看出前面的重复次数占8个字符,因此,可以用命令cut
-c
9-
取出每行第9个及其以后的字符。
$
sort
test.txt
|
uniq
-c
|
sort
-rn
|
cut
-c
9-
Hello
World.
The
Iphone
of
Apple
company.
Apple
and
Nokia.
My
name
is
Friendfish.
I
wanna
buy
an
Apple
device.
下面附带说一下cut命令的使用,用法如下:[plain]cut
-b
list
[-n]
[file
...]
cut
-c
list
[file
...]
cut
-f
list
[-d
delim][-s][file
...]
上面的-b、-c、-f分别表示字节、字符、字段(即byte、character、field);
list表示-b、-c、-f操作范围,-n常常表示具体数字;
file表示的自然是要操作的文本文件的名称;
delim(英文全写:delimiter)表示分隔符,默认情况下为TAB;
-s表示不包括那些不含分隔符的行(这样有利于去掉注释和标题)
三种方式中,表示从指定的范围中提取字节(-b)、或字符(-c)、或字段(-f)。
范围的表示方法:
n
只有第n项
n-
从第n项一直到行尾
n-m
从第n项到第m项(包括m)
-m
从一行的开始到第m项(包括m)
-
从一行的开始到结束的所有项
在写这篇文章的时候,用到了vim的大小写转化的快捷键:gu变小写,gU变大写。结合ctrl+v能够将一片文字中的字符进行大小写转换,非常好用。
H. linux去重命令
linux重启命令是:
1、在命令行中输入: shutdown -r now : 表示现在重启计算机,按下回车便会进行重启。
银虚2、另一种重启方式就是输入: reboot 也表示重启,一样会进行重启。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行锋正燃主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网清茄络操作系统。
I. linux 文本处理,去重问题
sortinput_file|uniq-w1
J. Linux下怎么合并一个文件夹下的所有文件,规则就是 只要任意两个文件含有一个相同的数字
while [ 1 -eq 1 ] ##无限循环直到所有文件相同的文件合并成功
do
i=0 ##使用数组应该好一些
j=0
for a in $(ls /xxx/xxx/*)
do
b[$i]=$a ##获取的所有文件赋予给数组
let i=i+1
done
while [ j -ln ${#b[@] ] ##文件有多个次,循环多少次,拿文件比较
do
for c in $(awk 'for(i=1;i<=4;i++){printf $i}' ${b[$j]}) ##文件里面有多少数据,循环多少次
do
let d=j+1
e=`cat ${b[$d]}|grep $c` ##拿第一个文件与后面一个文件比是否存有相同的数
if [ $e -eq 1 ]
then
sort -u ${b[$j]} ${b[$d]} > $j.txt ##如腔族果有重复的就合并到文件,没有继续与第3个文件比较
break; ##然后终止循环,为什么要终止循环?因为合并的文件还有可能与后面的文件重 ## 复数字,故退出循环,掘圆蔽进入大的循环再获取新的判州文件比较
else if [ j -eq $(${#b[@]-1) ] ##如果比到倒数第二个文件和最后一个文件没有没有相似点则退出程序, ##比较完毕
exit;
fi
done
then
exit
fi
done
done