Grep 精确数字匹配

Grep 精确数字匹配

我正在使用 grep 提取长文件第 2 列中的一些精确数字。

我正在使用以下代码:

grep  -e "^71161 |^71072 |^72617 " mainfile > outputfile

这没有任何作用outputfile

请帮忙。

我的文件是这样的:

Date        ID  STN     SUPER   LAT     LONG    OBS     VAR
2014060106  71072   146 S000438 48.37   270.68  2   0   
2014060106  71108   12  71108   49.03   237.63  0   0.04
2014060212  71108   12  71108   49.03   237.63  0   0.16    
2014060212  71120   12  71120   54.4    249.73  0   0   
2014060212  71123   12  S000400 53.32   246.42  0   0.11    
2014060212  71125   12  S000961 54.13   251.48  0.05    0.00
2014060212  71140   12  S000388 49.92   260.05  2   0.21    
2014060212  71150   146 71150   50.45   259.4   1   2.21    

答案1

awk这里可能是更好的选择:

awk 'BEGIN{a[71161] a[71072] a[72617]}; $2 in a' < mainfile

或者:

awk '$2 ~ /^(72617|71072|71161)$/' < mainfile

或者:

awk '$2 == "71161" || $2 == "71072" || $2 == "72617"' < mainfile

(请注意,对于 POSIX awk 实现(尽管不是当前 Linux 发行版上常见的实现),==应用于字符串的运算符会测试两个字符串是否相同整理相同的,这可以不同于平等。例如,在 UTF-8 语言环境中的 GNU 系统上,POSIX awk 将返回 true,因为"71161" == "٧١١٦١"在这些 GNU 语言环境的当前版本中,东部阿拉伯数字与西部阿拉伯数字(英语)的等效值相同。因此,为了防止这种情况,您可能需要设置LC_ALLC)。

你也可以做数字比较:

awk '$2 == 71161 || $2 == 71072 || $2 == 72617' < mainfile

它还会返回第二个字段为 71161.0 或 71.161e3 或 0x115f9 的行(对于 GNU awk,您需要在环境中传递 POSIXLY_CORRECT 才能考虑十六进制数字)。

相关内容