我是新来的Mac上的terminal工作,并有一个大的.tsv文件,其中包含一个项目列表,并在它旁边的两个值。 我希望能够打印项目第一次出现旁边的重复项数量而不删除其他数据。
我知道cut -f 1 | sorting| uniq -c但是这删除了很多宝贵的数据,我想保留进行分析。 我正在阅读有关awk和grep,但我想我可以使用一些帮助。
这是我想要处理的文件的一个例子:
fruit number reference apple 12 342 apple 13 345 apple 43 4772 banana 19 234 banana 73 3242 peach 131 53423 peach 234 3266 peach 242 324 peach 131 56758 peaches 29 2434
理想情况下,输出结果如下所示:
fruit number reference fruit_count apple 12 342 3 apple 13 345 apple 43 4772 banana 19 234 2 banana 73 3242 peach 131 53423 4 peach 234 3266 peach 242 324 peach 131 56758 peaches 29 2434 1
这样的事情甚至可能吗? 我可以使用公式获得所需的输出excel,但文件太大,不断崩溃在我身上。 任何帮助,将不胜感激。
编辑:添加我目前的解决scheme(不符合我的要求)
cut -f 1 fruitsample.txt | sort | uniq -c | sed -e 's/ *//' -e 's/ / /'
这给了我预期的计数,用一个制表符replaceuniq -c的标准计数+空间输出,但它也对标题行进行sorting并删除第二列和第三列。
在Excel中,我可以使用公式=IF(COUNTIF(A$2:A2,A2)=1,COUNTIF(A:A,A2),"")
并填充它。 我正在使用的文件是近680K行的数据,Excel扼stream器试图计算许多行。
正如我所说,我是一个初学者寻找指导。 我只是不熟悉awk或grep。 再次感谢!
awk
来拯救!
awk 'NR==FNR {a[$1]++; next} FNR==1 {print $0, "fruit_count"; next} $1 in a {$(NF+1)=a[$1]; delete a[$1]}1' file{,} | column -t fruit number reference fruit_count apple 12 342 3 apple 13 345 apple 43 4772 banana 19 234 2 banana 73 3242 peach 131 53423 4 peach 234 3266 peach 242 324 peach 131 56758 peaches 29 2434 1
对于主要思想的解释,我将使用一个没有标题的简单结构,以及未分类的数据
$ cat file apple banana apple apple cherry banana $ awk 'NR==FNR {a[$1]++; next} # in the first pass, save key counts $1 in a # if the key in map {$(NF+1)=a[$1]; # add the count as a last column delete a[$1]} # remove key from map 1 # print ' file{,} | # bash shorthand for: file file column -t # pretty print columns apple 3 banana 2 apple apple cherry 1 banana
为简化的例子,使用unix工具链,你可以实现与
join -a1 -11 -22 -o1.2,2.1 <(cat -n file) <(cat -n file | sort -k2 | uniq -c -f1)
添加标题将需要更多的杂耍; 这是awk
闪耀的地方。
另一个使用awk和double- tac
s:
$ tac file | awk ' NR>1 {print q, (p==$1?"":++c)} # p previous first field, q previous record {c=(p==$1?c+1:0); p=$1; q=$0} # c is the counter END {print q, "fruit_count"} ' | tac fruit number reference fruit_count apple 12 342 3 apple 13 345 apple 43 4772 banana 19 234 2 banana 73 3242 peach 131 53423 4 peach 234 3266 peach 242 324 peach 131 56758 peaches 29 2434 1
这样就可以在输入文件的单个过程中执行所需的操作,并且每次只能在内存中存储1个水果的值,所以即使您的文件对于MS-Excel来说太大也不应该存在性能或内存问题:
$ cat tst.awk NR==1 { print $0, "fruit_count"; next } $1 != prev { prt() } { arr[++cnt] = $0; prev = $1 } END { prt() } function prt( i) { if (cnt) { print arr[1], cnt for (i=2; i <= cnt; i++) { print arr[i] } delete arr cnt = 0 } } $ awk -f tst.awk file | column -t fruit number reference fruit_count apple 12 342 3 apple 13 345 apple 43 4772 banana 19 234 2 banana 73 3242 peach 131 53423 4 peach 234 3266 peach 242 324 peach 131 56758 peaches 29 2434 1