【问题标题】:Awk delete line and copy to a log file if criteria is not matched?如果条件不匹配,awk 删除行并复制到日志文件?
【发布时间】:2017-06-14 09:54:29
【问题描述】:

假设我们有一个这样的字符串:

383;06;55.270989;144991494994851A5485AA54J7HH337H3H33HT570BBG7BBGBT07BT7R55U155U5IR75I79QQ9SQQ9Q597Q57S229122928S4284;N

但是在文件下面我们会遇到这样的事情:

383;06;55.270989;||<FD><F0>p|/x|<A9>|<E2>|,|<F7>|l|L@<F5>q|I|b%<EB><AB><C2>l|F|<D7>%|<C0><E4>wy||z<BE>|;|b<E5>&x"h<D1>e|j|E|c|<F4><E1>
<C2>4^|Q|<EF>H|<E0>2t<C2>6'<E4><C7>||Z|<E0>q|9d|;N

有没有办法运行它并说明 txt 文件是否没有 x 个字段(分隔符;)或将其从文件中删除并将其放入日志文件中?

编辑:此方法还包括为正在删除的数据记录日志以供以后分析

【问题讨论】:

标签: bash awk sed


【解决方案1】:

要输出两个文件,您可以在要删除的行的情况下重定向打印语句。将要保留的行写入 tmp 文件并复制回您的输入:

$ cat input
383;06;55.270989;144991494994851A5485AA54J7HH337H3H33HT570BBG7BBGBT07BT7R55U155U5IR75I79QQ9SQQ9Q597Q57S229122928S4284;N
383;06;55.270989;||<FD><F0>p|/x|<A9>|<E2>|,|<F7>|l|L@<F5>q|I|b%<EB><AB><C2>l|F|<D7>%|<C0><E4>wy||z<BE>|;|b<E5>&x"h<D1>e|j|E|c|<F4><E1><C2>4^|Q|<EF>H|<E0>2t<C2>6'<E4><C7>||Z|<E0>q|9d|;N

$ awk -F\; 'NF != 5 { print > "logfile.log"; next }1' input > tmp; mv tmp input

$ cat logfile.log
383;06;55.270989;||<FD><F0>p|/x|<A9>|<E2>|,|<F7>|l|L@<F5>q|I|b%<EB><AB><C2>l|F|<D7>%|<C0><E4>wy||z<BE>|;|b<E5>&x"h<D1>e|j|E|c|<F4><E1><C2>4^|Q|<EF>H|<E0>2t<C2>6'<E4><C7>||Z|<E0>q|9d|;N

$ cat input
383;06;55.270989;144991494994851A5485AA54J7HH337H3H33HT570BBG7BBGBT07BT7R55U155U5IR75I79QQ9SQQ9Q597Q57S229122928S4284;N

【讨论】:

  • 我对这种命令完全不熟悉,当所有这些行都在一个文件中时我该怎么办?
  • 在我的示例中,带有原始行的文件的名称是“input”。只需将其替换为文件的真实名称(在它出现的两个地方)。您可能还想用更有意义的名称替换“logfile.log”。请注意,运行命令后,您将替换原始文件!确保你保留一份副本:-)
猜你喜欢
  • 1970-01-01
  • 2015-01-25
  • 2022-01-14
  • 2014-03-31
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多