awk - Delimiter作为数字和|的组合(管道)不工作

时间:2018-06-09 10:36:29

标签: linux shell unix awk

我有一个输入文件,其中包含一些记录,如下所示

input.txt中

Record|111|aaa|aaa|11|1-bb|bb|1111|cccc|cccc
Record|11|1-aaa|aaa|111|bb|bb|1111|cccc|cccc
Record|111|aaa|aaa|11|1-bb|bb|1111|cccc|cccc
Record|111|aaa|aaa|111|bb|bb|11|1-cccc|cccc
Record|22|aaa|aaa|222|bb|bb|2222|cccc|cccc|11|1-dddd|dd
Record|333|aaa|aaa|11|1-bb|bb|333|cccc|cccc
Record|11|1-aaa|aaa|102|bb|bb|1111|cccc|cccc

我想在|11|中使用分隔符awk并获取第二个字段,我尝试了以下最常用的方法,

命令

awk -F'|11|' '{print $2}' input.txt

输出

1|aaa|aaa|
|1-aaa|aaa|
1|aaa|aaa|
1|aaa|aaa|
|1-dddd|dd
|1-bb|bb|333|cccc|cccc
|1-aaa|aaa|102|bb|bb|

预期输出

1-bb|bb|1111|cccc|cccc
1-aaa|aaa|111|bb|bb|1111|cccc|cccc
1-bb|bb|1111|cccc|cccc
1-cccc|cccc
1-dddd|dd
1-bb|bb|333|cccc|cccc
1-aaa|aaa|102|bb|bb|1111|cccc|cccc

基本上它不考虑分隔符|的最后|11|,而是采用分隔符|11

我在下面尝试了所有,没有人给我预期的输出,

awk -F"|11|" '{print $2}' input.txt       # gives wrong output
awk -F\|11\| '{print $2}' input.txt       # gives Wrong output
awk -v FS='|11|' '{print $2}' input.txt   # gives Wrong output

最后我必须在for内写一个awk循环,其分隔符为|以使其正常工作,我想知道为什么简单的解决方案不起作用

2 个答案:

答案 0 :(得分:5)

-F的参数是一个正则表达式。

awk -F "\\\|11\\\|" '{print $2}' file

awk -F '\\|11\\|' '{print $2}' file

或(感谢EdMorton

awk -F'[|]11[|]' '{print $2}' input.txt

输出:

1-bb|bb|1111|cccc|cccc
1-aaa|aaa|111|bb|bb|1111|cccc|cccc
1-bb|bb|1111|cccc|cccc
1-cccc|cccc
1-dddd|dd
1-bb|bb|333|cccc|cccc
1-aaa|aaa|102|bb|bb|1111|cccc|cccc

答案 1 :(得分:0)

Cyrus explained为什么你的分隔符不能按预期工作(正则表达式引用问题的组合)。

使用sed,删除每行上的所有内容,包括|11|

$ sed 's/.*|11|//' input.txt
1-bb|bb|1111|cccc|cccc
1-aaa|aaa|111|bb|bb|1111|cccc|cccc
1-bb|bb|1111|cccc|cccc
1-cccc|cccc
1-dddd|dd
1-bb|bb|333|cccc|cccc
1-aaa|aaa|102|bb|bb|1111|cccc|cccc