情景linux--如何得出一个文件的第二列?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了情景linux--如何得出一个文件的第二列?相关的知识,希望对你有一定的参考价值。
参考技术A曾经有一同事问我,在linux下如何输出一个文本文件的第二列,文本内容不限。我不假思索地说用 awk 啊。她追问只有这一种方式么?于是我仔细想了想,……
既然内容不限,则可以自定义文件内容的格式,这样可以用的命令自然会多一些。
需求为输出文件第二列,则基本上有两种方式实现:
因而,任何能直接输出特定列的命令,以及能够截取或删除其它列的命令都满足此需求。
为了方便说明,列举几个示例文件:
awk自然是最容易想到的,它处理格式化的文本得心应手。
使用 -F 指定列(字段)分隔符。
如果文件只有两列,还可以使用 $NF ,如 awk \'print $NF\' test1.txt 。
awk还支持一些函数,同样可以将第二列提取出来,此处不再赘述。
cut命令的默认字段分隔符是 TAB ,可以使用 -d 重新指定。 -f 列出指定字段。
如果第二列的字符的起始和结束序号为固定值,如test2.txt,可以使用 -c 参数,截取特定的字符序列。
sed采用的是第二种实现方式,即将其它列删除掉,利用 后向引用 :
在test1.txt中,第二列的前面和后面分别为数字空格和空格数字,所以可以利用 正则表达式 将其输出出来。
同理:
colrm命令可以删除标准输入中的指定列,但 该命令中所定义的列指的是单个字符 ,这与常规对字段的定义不同,需注意。
格式如下:
如果只指定start,则大于等于start的列均被删除;如果指定了start和stop,则大于等于start,小于等于stop的列被删除。
因此,此命令可处理第二个字段起始位置为固定值的test2.txt文件。
read读取文件中的每行,将特定的列输出来。
shell支持命令替换,通过两次命令替换,得到第二列:
虽然不清楚她从哪里看到的这道题目,题目本身是何用意。但以一个问题,调动起了对linux多个命令及知识点的学习和总结,还是有价值的。
欢迎提出不同解法!
相关命令
Linux脚本练习之script068-第二列是否有重复
script068
题目
注:题目来源于 SHELL10 第二列是否有重复 。
给定一个 nowcoder.txt
文件,其中有 3
列信息,如下实例,编写一个 shell 脚本来检查文件第二列是否有重复,且有几个重复,并提取出重复的行的第二列信息。实例:
20201001 python 99
20201002 go 80
20201002 c++ 88
20201003 php 77
20201001 go 88
20201005 shell 89
20201006 java 70
20201008 c 100
20201007 java 88
20201006 go 97
结果:
2 java
3 go
脚本一
思路就是提取文本中的第二列内容,然后对其进行排序去重,统计每个去重后单词的出现次数,最后筛选出出现次数大于等于 2 的单词。
cat nowcoder.txt | sort -k 2 | awk 'print $2'
表示提取文件中的第二列并排序;uniq -c
表示对第二列进行去重并统计每行单词的出现次数;awk 'if($1>=2) print $0'
表示筛选出出现次数大于等于 2 的行;sort -nr -k 1
表示安装词频升序排列;sed 's/^[ \\t]*//g'
表示去除行首的空格。
cat nowcoder.txt | sort -k 2 | awk 'print $2' | uniq -c | awk 'if($1>=2) print $0' | sort -nr -k 1 | sed 's/^[ \\t]*//g'
脚本二
同脚本一基本一致。
awk 'print $2' nowcoder.txt | sort | uniq -c | sort -n -k 1 | awk 'if($1>=2) print $0' | sed 's/^[ \\t]*//g'
脚本三
将文件中每一行第二列的单词存储到关联数组中,键名是单词,键值是该单词的出现次数,这步操作在 中完成;接着在
END
中通过循环遍历关联数组中,筛选出单词出现次数大于 2 的词汇,并打印它们的出现次数和词汇。
awk 'map[$2]++ ENDfor(k in map) if(map[k]>=2) printf("%d %s\\n", map[k], k)' nowcoder.txt
以上是关于情景linux--如何得出一个文件的第二列?的主要内容,如果未能解决你的问题,请参考以下文章
Linux字符串截取和处理命令 cutprintfawksedsortwc
Linux字符串截取和处理命令 cutprintfawksedsortwc