'\t'指的是file.csv不同列以'\t'分割,如果的是以其他符号分割,换成其她符号;
'{print $2}'是指取第2列,此处从1开始计数,第1列,第2列;
一般去重之前要进行排序
cat file.csv | awk -F '\t' '{print $2}' | sort | uniq
前半部分与命令1一样,后面加上| sort | uniq
比如通过命令2发现,第2列取值有两种,分别是'neg'和‘pos’,那么我想知道有多少行的第2列取值为'pos',多少行的第2列取值为'neg'。
cat file.csv | awk -F '\t' '{print $2}' | grep -o 'neg'| wc -l
前半部分与命令1一样,后面加上 | grep -o 'neg'| wc -l
grep -o 'neg'就是取出取值为'neg'的行
wc -l 是计数有多少行
1、使用vim编辑器来打开文件。
2、来看第一种方式,删除文件中指定的行,当使用vim打开文件的时候,页面的右下角会显示出当前光标的位置,比如光标停在第一排5的位置,右下角显示的就是1-5。
3、然后就可以根据这个字符找到指定的列,在vim编辑器的普通模式下,按下键盘上的x键,就会删除这个字符。然后再移动 j 键,光标就会移动到下一行,就这样依次按下j 、x键,就能很快删除不同行中的同一列。
4、还有一种方法,将光标移动到未删除的第5列数字上,然后在键盘上按下ctrl+v键。如下面图中所示,编辑页面的左下角会出现一个VISUAL BLOCK字样。。
5、然后这时,再按键盘上的 j 键往下移动,这个时候会发现,所有第5列的字符都被选中了。
6、这个时候再按删除的 x 键,第5列的字符就瞬间被删除了。就完成了。
楼上 uniq必须是连续的重复才行把用awk肯定行
这是一个cu的精华帖,差不多,对于你的问题你给稍等我修改一下。(ps感谢红袖添香大姐)
CU精华 经典回顾
#假设我有如下文件:
#cat aa
#123 def1 456
#345 def2 812
#123 def3 563
#322 def4 684
#123 def5 879
#......................
#现在我想把第一列中字段相同的合并,第一列不相同的则保留,合并的原则就是保留第一个出现的前两个字段,第三个字段则把结果相加,以上面的示例为例:
#
#就是对于123开头的需要合并,合并后应该成为如下:
#cat aa
#123 def1 1898
#345 def2 812
#322 def4 684
#请问用shell如何实现?
#希望各位帮助!,谢谢!!
#要求总结:
#1 合并相同的第一列数据,并且计算第三列和
#2 第二列只保留第一次出现
#3 第一列顺序不变
觉得这个问题很经典,所以从CU论坛转过来了。
请大家一起学习
我们站在巨人的肩膀上。
问题补充:
看不太懂实现可以讲一下思路吗?
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
我是这样做的
--------------------------2
谢谢你的补充, 已经明白了你对split的适用技巧,是用split(a[$1],tmp)在碰到匹配的$1时取出以前的统计结然后再用$3加上以前的结果是吧,很巧妙。谢谢
但是有2个问题:
1不满足 第二列保留第一次出现记录(现在是保留最后一次出现)
2不满足 第一列按照原来文件顺序出现
看看这个
awk 'BEING{n=0}
{
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
if($1 in ind)next
ind[$1]
key[n]=$1
n++
}
END{
for(i in key)print key[i],b[key[i]],a[key[i]]
}' filename
#######################
#######################
#######################
这样就行了
#!/bin/bash
awk 'BEGIN{n=0}
{
if($0 in a)next
a[$0]
b[n]=$0
n++
}
END{
for(i in b)print b[i]
}' data
前提是你的数据文件里面每行没有空格,如果有用-F设定一个没有的字符作分隔符就
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)