【发布时间】:2023-01-30 05:22:41
【问题描述】:
我正在尝试提取字段与定义为变量的模式匹配的所有行。 我尝试了以下
head input.dat |
awk -F '|' -v CODE="39905|19043" '{print $13; if($13~CODE){print "Matched"} else {print "Nomatch"} }'
我在尝试模式匹配之前打印字段的值。(这样我就不必显示包含许多字段的整行) 这是我得到的输出。
PLAN_ID
Nomatch
39905
Nomatch
39905
Nomatch
39883
Nomatch
19043
Nomatch
2215
Nomatch
19043
Nomatch
9149
Nomatch
42718
Nomatch
24
Nomatch
我希望在输出中看到至少 3 个 Matched 实例。我究竟做错了什么?
由@Fravadona 编辑
xxd input.dat | head -n 6
00000000: fffe 4d00 4f00 4e00 5400 4800 5f00 4900 ..M.O.N.T.H._.I.
00000010: 4400 7c00 5300 5600 4300 5f00 4400 5400 D.|.S.V.C._.D.T.
00000020: 7c00 5000 4100 5400 4900 4500 4e00 5400 |.P.A.T.I.E.N.T.
00000030: 5f00 4900 4400 7c00 5000 4100 5400 5f00 .I.D.|.P.A.T..
00000040: 5a00 4900 5000 3300 7c00 4300 4c00 4100 Z.I.P.3.|.C.L.A.
00000050: 4900 4d00 5f00 4900 4400 7c00 5300 5600 I.M._.I.D.|.S.V.
事实证明,输入文件使用 UTF-16 LE 编码(如内容的 hexdump 所示)。因此,解决方案似乎是在运行 AWK 之前将输入文件从 UTF-16LE 转换为 UTF-8。谢谢
【问题讨论】:
-
在提供的示例(4 个匹配项)上,代码对我有用(用
$1替换$13)。 gawk,mawk,busybox,原始 awk -
cat -vet input.dat | head -10如果您在每行末尾看到^M$,请使用dos2unix input.dat。快速测试,通常是 *nix 上神秘问题的来源。祝你好运。 -
@user5336 请将
xxd的输出编辑到您的问题正文中。祝你好运。 -
在这一点上,我的偏好是获取
input.dat内容的实际副本;请使用以下任一的完整输出更新问题:head -2 input.dat | xxd或head -2 input.dat | base64;这些中的任何一个都使我们能够在我们的系统中重新创建文件前两行的精确副本 -
请停止在无法格式化且可能遗漏的 cmets 中发布信息 - edit 您的问题包括所有相关信息。
标签: awk