情景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脚本练习之script068-第二列是否有重复

Linux字符串截取和处理命令 cutprintfawksedsortwc

python如何读取csv指定内容所在行的第二列内容?

Linux字符串截取和处理命令 cutprintfawksedsortwc

如何将两个熊猫列混合到一个数据框中,第一列的第一个元素,第二列的第二个元素等等? [复制]

如何检查sql的第一列或第二列中是不是存在一个特定值?