在gawk中匹配后打印下一列

时间:2017-04-20 10:48:06

标签: awk grep gawk

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

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>,然后打印出 next 列,然后在文件输出中添加3或4个其他列,我将总是希望开始时的日期和时间。

问题在于,除了日期和时间之外,字段位置可以更改并且不是静态的。

我尝试了各种gawk命令但是我尝试或搜索过的任何内容都没有给我提供所需的信息。

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

我还希望以逗号分隔的文件输出并删除&lt;&gt;来自各栏

我想要的是一个类似下面的输出,我可以选择我需要用逗号分隔的列

170228 000005,1FARHANA/MRS,QR118,QR

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

几个问题。

首先,你有引号问题。 shell会混淆AWK引号和shell引号之间的混淆。修复错误后,

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

另一件事,如果你的分隔符是[&lt;&gt;],那么没有单词可以是“”,因为单词从不包含分隔符。修复错误后,

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

第三,你的单词不是由单个'&gt;'分隔的。或'&lt;'。它们由“&gt;&lt;”或“&lt;”或“&gt;”分隔。你可以用'[&lt;&gt;] +'来模仿它。所以,最后,

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