我有一个输入文件,其中包含一些记录,如下所示
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
循环,其分隔符为|
以使其正常工作,我想知道为什么简单的解决方案不起作用
答案 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