如何使用Linux命令显示文件中每行的第一个单词?

34

我有一个包含许多行的文件,想要用Linux命令仅显示每行的第一个单词。

我该如何做到这一点?


可能是仅打印字符串中的第一个字段的重复问题。 - Chris Seymour
5
这个问题已经被问了无数次,可以有很多种解决方法。下次请尝试搜索。我投票关闭。 - Chris Seymour
3
我相信有重复的内容,但我认为建议的那个不是很匹配。 - Jonathan Leffler
6个回答

51

您可以使用awk命令:

awk '{print $1}' your_file

这将“打印”your_file中的第一列($1)。


帖子已编辑,为什么在同时提供正确答案时还要给出错误的解决方案?这是一个无用的cat使用:http://partmaps.org/era/unix/award.html#cat - Gilles Quénot
他在问题中指定了 cat;我想至少展示一下如何在管道命令中使用它(但我确实提到了这对于此目的来说有些过度kill =P)。 - newfurniturey

45

尝试使用来完成此操作:

grep -Eo '^[^ ]+' file

16

尝试使用coreutils cut来执行此操作:

cut -d' ' -f1 file

4

我看到已经有了答案。但你也可以使用sed完成这个任务:

sed 's/ .*//' fileName

2
上述解决方案似乎适用于您的特定情况。对于更一般的应用,需要考虑单词通常被定义为由空格分隔,但不一定是具体的空格字符。例如,您的文件中的列可能是以制表符分隔的,甚至是由制表符和空格混合分隔的。
前面的例子都有助于查找以空格分隔的单词,而只有awk示例也可以查找以其他空格字符分隔的单词(实际上,在各种sed/grep版本中统一做到这一点相当困难)。您还可以通过修改awk语句来明确跳过空行:
awk '{if ($1 !="") print $1}' your_file

如果您也关心空字段的可能性,即以空格开头的行,则需要更强大的解决方案。我不太擅长使用awk来处理这种情况,但是一个简短的Python脚本可以解决问题,例如:

>>> import re
>>> for line in open('your_file'):
...     words = re.split(r'\s', line)
...     if words and words[0]:
...         print words[0]

实际上,Perl正则表达式在grep中广泛可用,而\s则方便地解决了问题:grep -Po '^\s*\K\S+' … - bobbogo

0

...或在Windows上(如果您有GnuWin32 grep):

grep -Eo "^[^ ]+" file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接