shell脚本去重
⑴ shell 中某个字段重复怎么去重
使用sort -u可去重
⑵ Shell | 文件内容处理
-u : 去重
-r : 降序
-o : 重定向到原文件
-n : 按数值排序
-t : 设定分隔符,如果以制表符作为分隔符,写作 -t $'\t'
-k : 设定列数
感谢 sort-根据染色体编号和坐标位置排序 让我增强了态枝手对 sort 的理解。
功能:检查及删除文本文件中重复搭尘出现的行,一般与sort命令结合使用
-c : 在每列旁显示该行重复出现的次数
-d : 仅显示重复出现的行,显示一行
-u : 仅显示非重复的行
-i : 忽略大小写
-1 、 -2 : 分别代表从第一和第二个文件中指定关键字列,这两个选项都使用列号作帆嫌为参数值
-a : 显示未匹配到的行
-s : 压缩重复的字符
-d : 自定义列分隔符,默认值为制表符
-f : 只选择列表中指定的文本列,文本列用列号表示,多个列之间用逗号隔开,连字符表示一段连续的列号
-b : 截取字符
⑶ shell脚本如何把总结果进行去重
有个简单的办法
你先把所有的echo都写到一个文兆带液族物行耐件中,然后cat 文件再sort加uniq
echo XX >> fileA
cat fileA | sort |uniq
⑷ Shell脚本判断文件是否存在
通察山过git命令统计出了我在某个分支上改动的所有文件列表(文件路径是以和git工作区根目录的相对路径保存的),写入了一个文件all.txt。但是,随即发现,这个列表中的某些文件是我在开发过程中新建,然后有删除的,现在工作区中并不存在这个文件。
由于工作腊如区的目录层级比较多,文件也比较多败局中,挨个检查基本是不可能的。于是,写了下面的脚本,放在git工作区的根目录运行,就能够找出那些不存在的文件:
这个脚本中就用到了一个知识点,就是shell如何判断文件存在。下面是一个运行的例子:
然后,通过vim的简单排序,去重命令,可以对这些结果进行筛选和简单处理。
⑸ linux文件合并,关键字去重复shell脚本
看看这个:
[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 中的顺序,你另外做个排序吧
⑹ shell脚本中的一句话求解释
这是用了awk数组
-F'-'
设置 - 为字段分隔符
++S[$1"-"$2]
awk数组下标并非一定要是整数。这句是在处理文件每一行时,将每行的第一个字段$1和第二个字段$2以 $1-$2 的字符串形式作为数组下标。这句主要用于统计文件中出现$1和$2相同的情况,出现一次相同情况,对应数组元素的值就加1。
if(S[a]>3) {sub(/-.*$/,"",a) print a}
出现三次以上,用字符串处理函数sub对数组下标a做替换操作。将匹配到的内容,即将字符串a中- 以及后面的内容都替换为空,只保留前面御胡的 $1。
/-.*$/是个正则表达式,匹配含有-的所有字符竖滚,$表示字符串的结尾,.*表示中间含有任意字符(可以为余拆余空)。
最后,总结:
遍历/tmp/ipt/bad.log文件,对前两个字段(以-分隔)相同且出现三次以上的记录,打印其第一个字段(估计就是想要的bad IP),将所有打印出来的内容排序并去重后导入/tmp/ipt/bad.ip。
⑺ 如何使用shell提取多个文本中相同的内容
问题太笼统,只能有个大致思路,按如下步骤:
使用类似下面的语句将所有文件整合为一个,排序去重后统计出一个最全数字合集。
catfile1file2file3...|sort|uniq>dataset
分别统计合集中的所有数字在各文件中出现的次数
forfileinfile1file2file3...
do
#分别统计dataset中每个友基数字在各个文件中段岩出现的次数
#结果以“数字次数1次数2次数3...”的形式存入一个文件statistic
done使用awk分析statistic文件,提取所有次数均>0的数字。
awk'BEGIN{flag=1}{for(i=2;i<=NF;i++){if($i==0)flag=0}if(flag==1)print$1}'statistic>result
最后握告御删除中间文件dataset和statistic,只保留最终结果文件result.
要具体咨询建议加我网络hi交流或直接追问。
⑻ 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脚本快速排序和去重文件数据
cat file|sort|uniq
这样就可以去掉重复行
⑽ shell脚本中怎样对逗号拼接的一系列字符串进行去重
方法有很多,我说两个思路,抛砖引玉:
1、将你的字符串转换成数组,然后循环两两比对,用unset去掉重复的,然后将这个数组重新转换成字符串并去除空值。
2、将逗号转换成换行,然后用uniq去重,然后转换回来。
可能还有更加简单的方法,需要自己研究下了