我想打印此文件的第 1 列。我使用了此命令:awk '{print $1}'
但它只打印了第 1 列的第一个单词。
数据
ABC transporters ABC transporters
Alanine, aspartate and glutamate metabolism Alanine, aspartate
alpha-Linolenic acid metabolism alpha-Linolenic acid metabolism
Aminoacyl-tRNA biosynthesis Aminoacyl-tRNA biosynthesis
Amino sugar and nucleotide sugar metabolism Amino sugar and nucleotide
Arachidonic acid metabolism Arachidonic
输出:
ABC
Alanine,
alpha-Linolenic
Aminoacyl-tRNA
Amino
Arachidonic
期望输出:
ABC transporters
Alanine, aspartate and glutamate metabolism
alpha-Linolenic acid metabolism
Aminoacyl-tRNA biosynthesis
Amino sugar and nucleotide sugar metabolism
Arachidonic acid metabolism
答案1
我可以看到您的列由两个空格分隔。
因此awk
:
awk -F '\\s\\s' '{print $1}'
答案2
由于这似乎是固定宽度的列,因此您只需输入cut
相应的字符即可。最宽的列Alanine, aspartate and glutamate metabolism
似乎是 44 个字符宽,因此:
$ cut -c1-44 foo
ABC transporters
Alanine, aspartate and glutamate metabolism
alpha-Linolenic acid metabolism
Aminoacyl-tRNA biosynthesis
Amino sugar and nucleotide sugar metabolism
Arachidonic acid metabolism
答案3
由于第二列明显重复了第一列的开头,我以此作为切割的标准sed
,因此它不依赖于列宽:
sed 's/^\(.*\)\(.*\) \1$/\1\2/'
第一个模式是重复的部分,在行\1
尾处反向引用。;s/ *$//
如果它们困扰您,您可以添加以删除尾随空格。
答案4
根据 muru 的回答,列的宽度是固定的,使用egrep
带选项的命令-o
将允许您仅打印由搜索模式指定的匹配行的匹配(非空)部分。但是,默认情况下,将打印整行。
$ egrep -o "^.{44}" foo