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

Jit*_*ria 1 unix linux shell 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
Run Code Online (Sandbox Code Playgroud)

我想用一个分隔符|11|awk,并得到了第二场,我想下面的最常见的方式,

命令

awk -F'|11|' '{print $2}' input.txt
Run Code Online (Sandbox Code Playgroud)

产量

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|
Run Code Online (Sandbox Code Playgroud)

预期产出

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
Run Code Online (Sandbox Code Playgroud)

基本上它不考虑最后一个|分隔符|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
Run Code Online (Sandbox Code Playgroud)

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

Cyr*_*rus 5

争论-F是一个正则表达式.

awk -F "\\\|11\\\|" '{print $2}' file
Run Code Online (Sandbox Code Playgroud)

要么

awk -F '\\|11\\|' '{print $2}' file
Run Code Online (Sandbox Code Playgroud)

或者(感谢EdMorton)

awk -F'[|]11[|]' '{print $2}' input.txt
Run Code Online (Sandbox Code Playgroud)

输出:

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

  • FWIW我会使用`-F'[|] 11 [|]`或`-F"[|] 11 [|]"`所以你不必担心你需要多少逃生但是我也是无论如何,总是在shell中的字符串周围使用单引号而不是double,除非特定需要让shell解析它,例如扩展shell变量. (2认同)