awk - 在 gawk 中匹配后打印下一列

标签 awk grep gawk

我有一个包含多行文本和多列的大文件,我在下面放置了一个示例集,该文件来自 Windows 服务器,并且 gawk 正在 Windows 上的 DOS 中运行。

170228 000005 0499 DE(N) SortationHandler.sortationio.Comm Sending Telegram: <ItemEvent><312285164><25243153><EXTERNAL_REDIRECTED><2017-02-28 00:00:05.062+0300><1><><0157368350><previousScans><0><2><position><sorter#0><destinations><2><=TT1-CHU013><=TT1-CHU081><36>
170228 000005 0499 DE(N) SortationHandler.sortationio.Comm Sending Telegram: <ItemEvent><312285166><25243152><INDUCTED><2017-02-28 00:00:05.437+0300><1><><0157370126><previousScans><0><1><position><sorter#0><36><screenedSufficiently>

我希望能够搜索特定字符串,例如 <passengerName>然后打印出列,然后将其他 3 或 4 列添加到文件输出中,我总是希望在开始时显示日期和时间。

问题是字段位置可能会发生变化,并且除了日期和时间之外不是静态的。

我尝试过各种 gawk 命令,但我尝试或搜索的任何命令都无法满足我的需要。

gawk -F'[<>]''{for(i=1;i<=NF;i++)if($i=="<passengerName>")print$(i+1)}'

我还想以逗号分隔的文件输出并删除列周围的 <>

我想要的是类似于下面的输出,我可以在其中选择我需要的以逗号分隔的列

170228 000005,1FARHANA/MRS,QR118,QR

如有任何帮助,我们将不胜感激

最佳答案

几个问题。

一方面,您在引用方面遇到了问题。 shell 会混淆 AWK 引号和 shell 引号。修复错误后,

gawk -F '[<>]' '{for(i=1;i<=NF;i++)if($i == "<passengerName>") print $(i+1)}'

另一件事,如果你的分隔符是[<>],那么任何单词都不能是“”,因为单词永远不包含分隔符。修复错误后,

gawk -F '[<>]' '{for(i=1;i<=NF;i++)if($i == "passengerName") print $(i+1)}'

第三,您的单词不是由单个“>”或“<”分隔的。它们由“><”、“<”或“">”分隔。你可以用“[<>]+”来模仿。所以最后,

gawk -F '[<>]+' '{for(i=1;i<=NF;i++)if($i == "passengerName") print $(i+1)}'

关于awk - 在 gawk 中匹配后打印下一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43517392/

相关文章:

linux - linux文件中两个最大模式的总和

replace - 如何通过命令行使用 TextWrangler 进行 "translate"Grep 查找/替换命令

regex - GREP 获取包含给定字符串的所有字符串

colors - cucumber :管道输出不掉色

mysql - 将 MySQL "INSERT"命令转换为文本

linux - AWK - END 语句中的 3 for 循环不是期望的结果

awk 将字符串拆分为单词和数字

bash - 将 txt 文件与 csv bash 中的第三列进行比较

bash - 如何删除 BASH 中 {} 大括号之外的所有内容?

awk 不使用 OFMT 和 $0 舍入