当前位置:首页 » 净水方式 » shell过滤重复

shell过滤重复

发布时间: 2021-01-13 18:44:38

❶ shell脚本取重复数据的最后一条记录

假设你这个.unl文件叫 file.unl,并且内容不含斜杠 / 。
脚本大致如下:

#!/bin/bash
myfile=file.unl
touch tmp
while read line
do
grep "$line" tmp >/dev/null 2>&1
if [ $? -eq 0 ]; then
num=`awk '{print $NF}' tmp`
num=`expr $num + 1`
sed -i “s/^\($line\t\)[0-9]*$/\1$num/” tmp
else
echo -e "$line\t1" >>tmp
fi
done <$myfile # ---> 1), 2)
awk '$NF>1{print}' tmp >err.unl # ---> 3)
sed -i 's/^\(..*\)\t[0-9]*$/\1/' tmp
mv -f tmp $myfile # ---> 4)
exit 0

思路就是,
1)遍历 unl 文件的每一行,逐行拷贝一份到临时文件tmp中,后面附加一个出现的次数。
2)遍历的同时到tmp文件中去查找是否有已存在的相同记录,如果有,就只是更新tmp文件中记录的次数而不添加一个新记录。
3)最后根据tmp文件中记录的次数是否大于1来生成err.unl文件,记录重复的行及总共出现的次数。
4)将tmp文件中的次数记录去除即得到更新后的 unl 文件。
由于要求要覆盖原unl文件,所以这里存在风险。 建议运行脚本前先备份一下原unl文件。

最后,恕我直言,这个题目的难度不止10分。
你看,while循环,grep / sed / awk,全用上了 ^_^
————————————————————————————————————
发现一个更简练的方法,两条命令即可搞定:
awk '{s[$0]+=1} END{for(a in s) print a, s[a]}' file.unl >err.unl
awk '{print $1}' err.unl >file.unl
当然,前提是unl文件的每行内容不能含有空格或TAB之类的分隔符。
参考了 http://..com/question/271261293.html#here 这个问题中shuguangbo童鞋的回答。

❷ SHELL脚本判断文件里有没有重复内容

遍历文抄件,用袭key计数,如果大于1就代表有重复
awk -F"=" 'BEGIN{i=0;j=0}{a[i++]=$0;b[j++]++}END{for (i=1;i<NF;i++){if(b[i]>1) print a[i]":"b[i] }}'

❸ Linux系统下Shell重复执行上条命令的几种方法

Linux系统下Shell重复执行上条命令的 4 种方法:
1、使用上方向键,并回车执行。
2、按 !! 并回车执行。
3、输入 !-1 并回车执行。
4、按 Ctrl+P 并回车执行。

❹ 用shell找出除ID外重复的列

楼主你不厚道。

====================

不知道是不是Linux的shell,如果是UNIX,就把下面的/bin/bash改为相应的shell。

下面是具体的代码和测试结果。

这个脚本是读"$1"参数的,所以执行的时候直接将1.txt缀上就可以了

格式如下:

./find.sh1.txt

==============shell脚本代码===============

#!/bin/bash

#FileName:FIND.SH

#Description:为网络知道提供的适用代码。

#文件总行数:

nLine=$(cat$1|wc-l)

#取第一行中”非ID“字符串。

findStr=$(cat1.txt|sed-n1p|sed's/(^[0-9]*,)(.*$)/2/')

#找出与findStr相匹配的所有行,统一输出到临时文件temp中保存等待整理。

cat$1|grep$findStr>temp

#整理temp中的内容,保存到formatTemp临时文件中。

nLTemp=$(cattemp|wc-l)

foriin$(head-n$((nLTemp-1))temp)

do

printf"$i||">>formatTemp

done

tail-n1temp>>formatTemp

#进入循环处理:

foriin$(cat$1)

do

findStr=$(echo$i|sed's/(^[0-9]*,)(.*$)/2/')

#如果findStr在formatTemp中已经存在了,就跳过这一行。

grep"$findStr"formatTemp>/dev/null

if[$?==0];then

continue

fi

#找出与findStr相匹配的所有行,统一输出到临时文件temp中保存等待整理。

cat$1|grep$findStr>temp

#整理temp中的内容,保存到formatTemp临时文件中。

nLTemp=$(cattemp|wc-l)

foriin$(head-n$((nLTemp-1))temp)

do

printf"$i||">>formatTemp

done

tail-n1temp>>formatTemp

done

#输出最后的formatTemp内容:

catformatTemp

#做最后的清理工作:

rm-ftempformatTemp

================================

================================

测试文件1.txt内容:

1,Jack,88,beer

2,tom,45,wine

3,Jack,88,beer

4,tom,45,wine

5,Jack,88,beer

6,White,99,beer

7,White,99,beer

8,Rock,100,wine

9,tom,45,wine

10,Rock,100,wine

=========================

输出结果:

[root@jiajiashellscript]#./find.sh1.txt

1,Jack,88,beer||3,Jack,88,beer||5,Jack,88,beer

2,tom,45,wine||4,tom,45,wine||9,tom,45,wine

6,White,99,beer||7,White,99,beer

8,Rock,100,wine||10,Rock,100,wine

=========================

❺ SHELL 怎么避免重复检测日志文件

#!/bin/bash

if [ -s ./line ] ;then
Oldline=`tail -1 ./line`
awk '{if('$Oldline'<NR) print}' file.log
Endline=`awk 'END{print NR}' file.log`
echo $Endline >> ./line
else
cat file.log
Endline=`awk 'END{print NR}' file.log`
echo $Endline >> ./line
fi
这个脚本比较粗糙,不知是否内能解决你的问题容。

❻ shell 中如何去除后重复项

uniq
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-f Fields 忽略由 Fields 变量指定的字段数目。 如果 Fields 变量的值超过输入行中的字段数目, uniq 命令用空字符串进行比较。 这个标志和 -Fields 标志是等价的。
-u 仅显示不重复的行。
-s Characters 忽略由 Characters 变量指定的字符的数目。 如果 Characters 变量的值超过输入行中的字符的数目, uniq 用空字符串进行比较。 如果同时指定 -f 和 -s 标志, uniq 命令忽略由 -s Characters 标志指定的字符的数目,而从由 -f Fields 标志指定的字段后开始。 这个标志和 +Characters 标志是等价的。
-Fields 忽略由 Fields 变量指定的字段数目。 这个标志和 -f Fields 标志是等价的。
+Characters 忽略由 Characters 变量指定的字符的数目。 如果同时指定 - Fields 和 +Characters 标志, uniq 命令忽略由 +Characters 标志指定的字符数目,并从由 -Fields 标志指定的字段后开始。 这个标志和 -s Characters 标志是等价的。

❼ shell中如何不重复输出

使用shuf命令,比如:
#!/bin/bash
for i in `shuf -i 1-10`
do
echo $i
done

❽ linux shell 脚本,重复执行命令。

#!/bin/sh
A=find /home/root/main -name 'deal';
chmod +x $A;
nohup $A $;

❾ Linux shell awk怎么去除行内,重复列

awk-F"[-,]"'{for(i=1;i<=NF;i++)a[$i,NR]++}{for(jina){split(j,b,SUBSEP);if(b[2]==NR)printfb[1]""}printf"
"}'关键词来.txt>去除重复后.txt

以此例测自试通过。


关于awk二维数组的使用:

awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,array[2,4] = 1这样的访问是允许的。awk使用一个特殊的字符串SUBSEP (34)作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2344。
类似一维数组的成员测试,多维数组可以使用if ( (i,j) in array)这样的语法,但是下标必须放置在圆括号中。
类似一维数组的循环访问,多维数组使用for ( item in array )这样的语法遍历数组。与一维数组不同的是,多维数组必须使用split()函数来访问单独的下标分量。split ( item, subscr, SUBSEP)。

❿ Linux中如何防止一个Shell脚本被重复执行

设定一个文件锁,例如/tmp/execed
脚本第一行就判断它是否存在,若存在直接退出
脚本最后一行做什么知道了把

热点内容
丁度巴拉斯情人电影推荐 发布:2024-08-19 09:13:07 浏览:886
类似深水的露点电影 发布:2024-08-19 09:10:12 浏览:80
《消失的眼角膜》2电影 发布:2024-08-19 08:34:43 浏览:878
私人影院什么电影好看 发布:2024-08-19 08:33:32 浏览:593
干 B 发布:2024-08-19 08:30:21 浏览:910
夜晚看片网站 发布:2024-08-19 08:20:59 浏览:440
台湾男同电影《越界》 发布:2024-08-19 08:04:35 浏览:290
看电影选座位追女孩 发布:2024-08-19 07:54:42 浏览:975
日本a级爱情 发布:2024-08-19 07:30:38 浏览:832
生活中的玛丽类似电影 发布:2024-08-19 07:26:46 浏览:239