【问题标题】:Need to separate row using sed or awk command in Solaris需要在 Solaris 中使用 sed 或 awk 命令分隔行
【发布时间】:2015-01-01 08:41:55
【问题描述】:

我在一行中有以下数据。

2014-12-30 00:00:02,317 pool-14076-thread-3 DEBUG [com.fundamo.connector.airtime.service.AirtimeService] ERS Response XML - <soap:Envelope><soap:Body><TopUpPhoneAccountResult><MessageID>1913351092</MessageID><MessageRefID>BD9123000000003</MessageRefID><TopUpPhoneAccountStatus><StatusID>200</StatusID><Comment>Transaction Successful</Comment></TopUpPhoneAccountStatus><TopUpPhoneAccountAmountSent><Amount>2000</Amount><AmountExcludingTax>2000</AmountExcludingTax><TaxName/><TaxAmount>0</TaxAmount><PhoneNumber>1766910910</PhoneNumber><ResponseDateTime>20141230000002320</ResponseDateTime><ServiceType>PRETOP</ServiceType><CurrencyCode>TK</CurrencyCode></TopUpPhoneAccountAmountSent></TopUpPhoneAccountResult></soap:Body></soap:Envelope>

现在我想从中获取一些值。我使用了这个命令:

cat ERS_RESPONSE_30Dec_atp11.txt |awk -F'<' '{print $1 "," $5 "," $7 "," $10 ","$12"," $16 "," $23}'

输出:

2014-12-30 00:00:02,317 pool-14076-thread-3 DEBUG [com.fundamo.connector.airtime.service.AirtimeService] ERS Response XML - ,MessageID>1913351092,MessageRefID>BD9123000000003,StatusID>200,Comment>Transaction Successful,Amount>2000,PhoneNumber>1766910910

但是,我只想要下面显示的字段。

2014-12-30 00:00:02,317 ,1913351092,BD9123000000003,200,Transaction Successful,2000,1766910910

我该怎么办?

【问题讨论】:

  • @nu11p01n73R 如果数据在一行,您必须确保在编辑帖子时它保持在一行。您确实从一条长线创建了 4 行。
  • @Basudev 你有两个2000 的条目,你想要其中的哪一个作为输出? &lt;Amount&gt;2000&lt;/Amount&gt;&lt;AmountExcludingTax&gt;2000&lt;/AmountExcludingTax&gt;&lt;Amount&gt; 值?或&lt;AmountExcludingTax&gt;?
  • 我的数据是一行.....
  • @KasiyA:我想要第一个值..2000
  • @nu11p01n73R 没问题,新年快乐 :)

标签: bash awk sed solaris-10


【解决方案1】:

这是使用awk的方法

awk -F"[ <>]" '{print $1" "$2,$18,$22,$28,$32" "$33,$41,$55}' OFS=, ERS_RESPONSE_30Dec_atp11.txt
2014-12-30 00:00:02,317,1913351092,BD9123000000003,200,Transaction Successful,2000,1766910910

这里有一些提示。

  1. 尝试找出每个字段之间的区别,她会是&lt;&gt;
  2. 然后找到所有字段,像这样运行它:awk -F"[ &lt;&gt;]" '{for (i=1;i&lt;=NF;i++) print i"="$i}' file
  3. 然后就是把它们放在一起。

【讨论】:

  • 它在我的服务器中不起作用...我的服务器如下所示。 SunOS ftpsvr 5.10 Generic_150401-09 i86pc i386 i86pc 我得到了几乎全部价值
  • @Basudev 什么不起作用。你得到一个错误,错误的输出?这个awk 没有使用任何特殊功能,所以它应该适用于大多数系统。
  • 我在命令下运行.... cat ERS_RESPONSE_30Dec_atp11.txt|awk -F"[ ]" '{print $1,$2,$18,$22,$28,$32" "$33,$41, $55}' OFS=,可以吗?
  • 您不应该将cat 与可以读取数据本身的程序一起使用。它会减慢速度,失去功能,使用更多资源。所以:awk -F"[ &lt;&gt;]" '{print $1,$2,$18,$22,$28,$32" "$33,$41,$55}' OFS=, ERS_RESPONSE_30Dec_atp11.txt。在管道| 之前和之后使用空间也很好。在您的帖子中也使用代码标签,cmets 在文本前后使用“`”进行标记。
  • 那么您的数据与您在此处发布的数据不同。尝试将帖子中的数据复制到新文件并测试您的命令。我还为您提供了如何自己解决问题的步骤。找到分隔符,循环遍历文件以获取所有字段编号,然后将其放回。
【解决方案2】:

您可以按如下方式尝试 sed(这有点长),然后是您的文件

sed 's#\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\},\S*\).*<MessageID>\([[:digit:]]\{1,\}\)<.*<MessageRefID>\([[:alpha:]]\{1,\}[[:digit:]]\{1,\}\).*<StatusID>\([[:digit:]]\{1,\}\).*\(Transaction Successful\).*<Amount>\([[:digit:]]\{1,\}\).*<PhoneNumber>\([[:digit:]]\{1,\}\).*#\1 ,\2,\3,\4,\5,\6,\7#g'

sed 替换为 sed -i.bak 以备份原始文件并进行实际更改,一旦这有效(命令行在我这边测试)

【讨论】:

    【解决方案3】:

    您需要在 Solaris 上使用 nawk 而不是 awk。在Solaris 版本的awk 中,-F 参数只能采用单个字符,而在nawk 中,它可以采用正则表达式。

    您需要将&lt;.....&gt; 的整个模式指定为分隔符,而不仅仅是&lt;

    这适用于 Mac:

    $ awk -F'<[^<]+>' '{print $1 "," $5 "," $7 "," $10 ","$12"," $16 "," $23}' ERS_RESPONSE_30Dec_atp11.txt
    

    在 Solaris 上尝试以下操作

    $ nawk -F'<[^<]+>' '{print $1 "," $5 "," $7 "," $10 ","$12"," $16 "," $23}' ERS_RESPONSE_30Dec_atp11.txt
    

    如果这不起作用......

    $ nawk -F'<[^<][^<]*>' '{print $1 "," $5 "," $7 "," $10 ","$12"," $16 "," $23}' ERS_RESPONSE_30Dec_atp11.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多