【问题标题】:separate and re-sort with awk multiple fields使用 awk 多个字段分离并重新排序
【发布时间】:2018-07-01 22:59:20
【问题描述】:

我有一个文件

input.txt

04120;2017-12-27;object1;2017-12-27;object2;2017-12-27;object3;2017-12-27;object4;2017-12-28;XXXXXX1;2017-12-28;XXXXXX2;2018-03-06;object5;2018-03-06;object6
06499;2018-05-30;object1;2018-05-30;object2;2018-05-30;object3;2018-05-30;XXXXXX1;2018-05-31;object4
04123;2017-12-28;object1;2017-12-28;XXXXXX1;2018-04-05;object2
04520;2018-02-11;object1;2018-02-11;object2;2018-02-16;XXXXXX1;2018-03-10;object3
04510;2018-02-09;object1;2018-02-09;object2;2018-02-09;XXXXXX1;2018-02-16;XXXXXX2;2018-04-04;object3

我的日志有不同的字段编号,用“;”分隔.如示例所示,我有 7、9、11 或 17 个字段 我需要在行尾保存第一个条目 XXXXXX 及其日期,以及它之前的对象。从行的中间删除这些字段

例如:

from 
04123;2017-12-28;<b>object1;2017-12-28;XXXXXX1</b>;2018-04-05;object2
to
04123;2017-12-28;object1;2018-04-05;object2;<b>2017-12-28;object1;XXXXXX1</b>

输出如下所示:

04120;2017-12-27;object1;2017-12-27;object2;2017-12-27;object3;2017-12-27;object4;2018-03-06;object5;2018-03-06;object6;2017-12-28;object4;XXXXXX1
06499;2018-05-30;object1;2018-05-30;object2;2018-05-30;object3;2018-05-31;object4;2018-05-30;object3;XXXXXX1
04123;2017-12-28;object1;2018-04-05;object2;2017-12-28;object1;XXXXXX1
04520;2018-02-11;object1;2018-02-11;object2;2018-03-10;object3;2018-02-16;object2;XXXXXX1
04510;2018-02-09;object1;2018-02-09;object2;2018-04-04;object3;2018-02-09;object2;XXXXXX1

如何在 bash 中执行命令行?尝试使用 awk,但我还没有得到它

【问题讨论】:

  • 请始终将您的努力也放在您的帖子中,因为我们都在这里学习,欢呼和快乐的学习。
  • 解决方案总是在展示的样本上给出,所以总是试着把你所有可能的排列和组合放在一个单独的镜头中,否则回复你帖子的人会重新工作。
  • 感谢@RavinderSingh13 的反馈,我正在学习,我将编辑并投入我的现实以避免这种情况。我还在学习,在这种情况下我不知道该怎么做
  • 我们都在这里诚实地学习 :) 我会要求你尝试从这些答案中学习并尝试自己申请,如果你不能这样做可能会打开一个新线程等,编辑不推荐现有的有很多答案的帖子,干杯和快乐的学习。
  • 好的,原问题我回了,我开个新话题,感激不尽

标签: bash awk command-line


【解决方案1】:

编辑:现在也改进我以前的解决方案。

awk --re-interval '
match($0,/object[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+.*X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}|object[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}/){
  value2=substr($0,RSTART,RLENGTH);
  num=split(value2,array,";");
  print substr($0,1,RSTART-1) array[1],array[num],substr($0,RSTART+RLENGTH+1),array[2],array[1],array[3]
}
'  OFS=";"  Input_file

您能否尝试关注一下,如果这对您有帮助,请告诉我。

awk --re-interval '
match($0,/object[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+.*X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}|object[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2};X+[0-9]+;[0-9]{4}\-[0-9]{2}\-[0-9]{2}/){
  value1=value2=substr($0,RSTART,RLENGTH);
  sub(/.*;/,"",value1);
  split(value2,array,";");
  print substr($0,1,RSTART-1) array[1],value1,substr($0,RSTART+RLENGTH+1),array[2],array[1],array[3]
}
'  OFS=";"  Input_file

输出如下。

04120;2017-12-27;object1;2017-12-27;object2;2017-12-27;object3;2017-12-27;object4;2018-03-06;object5;2018-03-06;object6;2017-12-28;object4;XXXXXX1
06499;2018-05-30;object1;2018-05-30;object2;2018-05-30;object3;2018-05-31;object4;2018-05-30;object3;XXXXXX1
04123;2017-12-28;object1;2018-04-05;object2;2017-12-28;object1;XXXXXX1
04520;2018-02-11;object1;2018-02-11;object2;2018-03-10;object3;2018-02-16;object2;XXXXXX1
04510;2018-02-09;object1;2018-02-09;object2;2018-04-04;object3;2018-02-09;object2;XXXXXX1

注意:只有旧版本的awk--re-interval,如果您的awk 版本是新版本,您可以删除它。

【讨论】:

  • 工作了一部分...... 2017-12-27;object3;2017-12-27;object4;2017-12-28;XXXXXX1;2017-12-28;XXXXXX2;2018-03-06;object5;2018-03-06;object6;2018- 03-06;object7;2017-12-28;XXXXXX3;2018-03-06;object8
  • @IgorTorres,解决方案是通过查看示例输入来准备的,以防它与您的实际输入不匹配,您也请更新您的示例并提供完整的详细信息。
  • 抱歉之前没有这样做,我用真实案例编辑了帖子
  • @IgorTorres,好的,我现在在另一篇文章中回复了,请在此处发表评论以获取更新,谢谢。
【解决方案2】:

使用 GNU awk 将第三个参数设为 match()gensub()

$ cat tst.awk
match($0,/(;[^;]+)(;[^;]+)(;XXX[^;]+)(.*)/,a) {
   $0 = substr($0,1,RSTART-1) a[1] gensub(/;[^;]+;XXX[^;]+/,"","g",a[4]) a[2] a[1] a[3]
}
{ print }

$ awk -f tst.awk file
04120;2017-12-27;object1;2017-12-27;object2;2017-12-27;object3;2017-12-27;object4;2018-03-06;object5;2018-03-06;object6;2017-12-28;object4;XXXXXX1
06499;2018-05-30;object1;2018-05-30;object2;2018-05-30;object3;2018-05-31;object4;2018-05-30;object3;XXXXXX1
04123;2017-12-28;object1;2018-04-05;object2;2017-12-28;object1;XXXXXX1
04520;2018-02-11;object1;2018-02-11;object2;2018-03-10;object3;2018-02-16;object2;XXXXXX1
04510;2018-02-09;object1;2018-02-09;object2;2018-04-04;object3;2018-02-09;object2;XXXXXX1

【讨论】:

  • 不工作 awk:源代码行 1 源文件 tst.awk 上下文中的语法错误是 >>> match($0,/(;[^;]+)(;[^;]+)( ;XXX[^;]+)(.*)/,
  • 如答案所说,它需要 GNU awk。
猜你喜欢
  • 2018-12-11
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多