awk分隔符正则表达式

awk分隔符正则表达式,awk,delimiter,Awk,Delimiter,我试图从一个类似这样的文件中提取所有的数字(只是数字)(总是三个“| | |”)并确保数字后面跟着3||| file: 12342|||blah blah 31221|||foo bar 12342|||bar foo 我只想要12342312112342 到目前为止我有 //works echo "2333|||test" | awk -F "([^1-9])+\|" '{print $1}' // should fail and return none echo "2333|||te

我试图从一个类似这样的文件中提取所有的数字(只是数字)(总是三个“| | |”)并确保数字后面跟着3|||

file:
12342|||blah blah
31221|||foo bar
12342|||bar foo
我只想要12342312112342

到目前为止我有

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

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

怎么样:

awk -F\| '{if (NF >= 4) print $1}' <foo
12342
31221
12342

awk-F\\\\'{if(NF>=4)print$1}'
awk-F'\''''''''/^[1-9]+\\\\\\\\\\/&&NF==4{print$1}'data.txt
你的意思是这样吗

awk -F'\\|\\|\\|' '{print $1}'
在精确的三个“| | | |”之前捕捉文本

grep-Po“^\d+(?=\\\\\\\\\\\)”

kent$grep-Po“^\d+(?=\\\\\\\\\\\\\\\\\\\\\\\)”如果您可能有一个数字后面跟两个管道的行,而您不需要这些,那么……如果您有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
)正则表达式查找行首、一个或多个数字、三个管道符号,后跟行尾或另一个非管道字符。

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

grep -oE '^[0-9]+\|{3}($|[^|])' file | grep -oE '[0-9]+'

不,我需要的是数字,不是那些废话。以及确保它只在开始时选择数字,后面跟着3 | | | | | |如何确保数字后面跟着三(3)| | |?这允许在“|”之间留有空格,如果这是个问题,您甚至测试过它吗?echo“2333 | | | test”| awk-F'\\\\\\\\\\\\\\\\\\\\\\\\\\\\''{print$1}'@user914584查看添加的grep行如何处理输入
123 | | | abc
?那是4根管子…很好。两个小诡辩。(1) 它允许“123 | a | b | c”有效。(2) 它不允许“123 | | | abc | def”通过。第二个是定义问题;拒绝这样做可能是正确的,也可能是错误的。第一个更严重;通过检查
$2==”&&&$3==”
可以修复此问题。
grep -oE '^[0-9]+\|{3}($|[^|])' file | grep -oE '[0-9]+'