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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux shell awk怎么去除行内,重复列?相关的知识,希望对你有一定的参考价值。

===关键词.txt===

芒硝-化工生产,硫化钠-化工生产

建筑史-研究-中国-近代-文集,建筑物-保护-中国-近代-文集

高等学校-课程改革-湖北省-文集,高等学校-课程建设-湖北省-文集

利用shell的相关命令,可以用awk,按照“-”“,”“ ”分隔一行关键词,去除行内重复关键词,得到
===去除重复后.txt===

芒硝,硫化钠,化工生产

建筑史,研究,中国,近代,文集,建筑物,保护

高等学校,课程改革,湖北省,文集,课程建设

提示:行内关键词顺序,不重要

谢谢。

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

以此例测试通过。


关于awk二维数组的使用:

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

追问

执行结果,有乱码。
==========================

�工生产 �钠 硫� 芒硝 �
近代 保护 中国 文集 建筑史 建筑物 研究
高等学校 �省 湖� 文集 课程改革 课程建设

追答

你是windows上编辑的文件吧,要用awk,需要先用dos2unix转为unix格式。

我做测试时是在linux下直接用vim创建的《关键词.txt》文件。

dos2unix 关键词.txt

然后再用awk。

追问

我都是在Ubuntu下执行的,一直乱码。检查了“关键词.txt”是unix回车符0a,utf8-nobomb编码

你那里运行正常的话,见私信告我吧

追答

可能环境有差异,我是在Redhat Linux服务器上测试的。

参考技术A , いつか権を手に入れば、血のしぶき天下(爆ましょう犬だ。追答

天降异象于前。

参考技术B 内行的概念还没听说过。
不过这个需求能开发出来的
可否私谈?

linux shell 如何行内排序

100万行的文件,内容如下,每行5列,空格分开,使用linux shell脚本对每一行进行排列
10 11 12 13 35
10 11 12 13 1
10 11 17 5 2
10 11 12 13 35
1 10 11 12 13
2 5 10 11 17
要排序成这样,每行都是从小到大
sort命令只能排序每行一个数,现在我要在行内排序,不是列排序

参考技术A hash的效率最高,其他排序都是浮云。 参考技术B 排序规则?

以上是关于Linux shell awk怎么去除行内,重复列?的主要内容,如果未能解决你的问题,请参考以下文章

Linux - Shell - cut: 低配 awk

linux shell 如何行内排序

【awk】笔记

如何使用 shell(awk、sed 等)删除文件中的前两列

Linux 命令小记

mysql 查询怎么去除重复列