我正在使用 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_ALL
为C
)。
你也可以做数字比较:
awk '$2 == 71161 || $2 == 71072 || $2 == 72617' < mainfile
它还会返回第二个字段为 71161.0 或 71.161e3 或 0x115f9 的行(对于 GNU awk
,您需要在环境中传递 POSIXLY_CORRECT 才能考虑十六进制数字)。