2

我试图从一个看起来像这样的文件中提取所有数字(只是数字)(总是三个'|||')并确保数字后面跟着3 |||

file:
12342|||blah blah
31221|||foo bar
12342|||bar foo

我只想得到 12342,31221,12342

到目前为止我有

//works
echo "2333|||test" | awk -F  "([^1-9])+\|"  '{print $1}'

// should fail and return none
echo "2333|||test" | awk -F  "([^1-9])+\|+"  '{print $1}'

任何的想法?

4

5 回答 5

3

awk -F'|' '/^[1-9]+\|/ && NF == 4 {print $1}' data.txt

于 2012-09-20T14:03:18.383 回答
3

你的意思是这样??

awk -F'\\|\\|\\|' '{print $1}'

捕捉精确三个“|||”之前的文本

grep -Po "^\d+(?=\|\|\|)"

kent$  grep -Po "^\d+(?=\|\|\|)" <<<"2333||tes"

kent$  grep -Po "^\d+(?=\|\|\|)" <<<"2333|||tes"
2333
于 2012-09-20T14:07:41.830 回答
1

如果您可能有一个数字后跟两个管道并且您不想要这些行,那么...如果您有 GNU grep,您可以使用:

grep -o '^[0-9][0-9]*|||' file | awk -F '|' '{print $1}'

您可以使用sed而不是awk进行后处理。该-o选项特定于 GNU grep,因此不能可靠地移植。

如果必须拒绝编号后有 4 个管道的行,则必须更加努力:

grep -E -o '^[0-9]+\|{3}($|[^|])' file | awk -F '|' '{print $1}'

扩展的 ( egrep) 正则表达式查找行首、一个或多个数字、三个管道符号,后跟行尾或另一个非管道字符。

于 2012-09-20T14:07:59.777 回答
1

这是一个扩展的 grep 替代方案:

grep -oE '^[0-9]+\|{3}($|[^|])' file | grep -oE '[0-9]+'
于 2012-09-20T14:10:11.477 回答
0

怎么样:

awk -F\| '{if (NF >= 4) print $1}' <foo
12342
31221
12342
于 2012-09-20T13:58:01.123 回答