过滤第一列

时间:2015-11-07 09:50:39

标签: regex unix awk sed grep

我正在使用谷歌英语1gram数据集link here,它看起来如下:

C'ape   1804    1       1
C'ape   1821    1       1
C'ape   1826    1       1
C'ape   1838    2       2
C'ape   1844    1       1
C'ape   1869    1       1
C'ape   1874    1       1
C'ape   1878    2       2
C'ape   1879    1       1
C'ape   1880    1       1
CABMEL  1873    1       1
CABMEL  1874    1       1
CABMEL  1875    1       1
CABMEL  1879    1       1
CABMEL  1884    1       1
CABMEL  1890    1       1
CABMEL  1899    1       1
CABMEL  1901    1       1
CABMEL  1903    3       2
CABMEL  1910    2       2
CABMEL  1912    1       1
CABMEL  1915    1       1
CABMEL  1926    2       2
CABMEL  1927    3       2
CABMEL  1928    4       2
CABMEL  1930    2       2

至少4列,有些行也包含5.第一列是1-gram,一个字符串,我想只提取那些在第一列中只包含字母的字符串的行(大写或小写仅限字母)。我在想grep应该这样做,但我找不到正确的正则表达式来完成这项工作。任何可以轻松完成工作的unix实用程序? 我相信列是制表符分隔的。

编辑:输出将仅包含带有CABMEL的行

2 个答案:

答案 0 :(得分:3)

grep -iE '^[a-z]+\s' file

应该这样做。现在使用\s来匹配空格(文件使用制表符作为分隔符)。

答案 1 :(得分:3)

使用Perl:

# Match all lines that start with a-z or A-Z and are followed by a space
perl -ne 'print if m/^[a-z]+\s/i' file

使用awk:

# Match first field's that only contain a-z or A-Z
awk '$1 ~ /^[a-zA-Z]+$/' file

两者都会输出:

CABMEL  1873    1       1
CABMEL  1874    1       1
CABMEL  1875    1       1
CABMEL  1879    1       1
CABMEL  1884    1       1
CABMEL  1890    1       1
CABMEL  1899    1       1
CABMEL  1901    1       1
CABMEL  1903    3       2
CABMEL  1910    2       2
CABMEL  1912    1       1
CABMEL  1915    1       1
CABMEL  1926    2       2
CABMEL  1927    3       2
CABMEL  1928    4       2
CABMEL  1930    2       2