【问题标题】:Unix repeat line number for each group in file based on patern probabelly with awk基于模式的文件中每个组的 Unix 重复行号可能使用 awk
【发布时间】:2016-10-12 22:38:47
【问题描述】:

我需要有关文本文件特定记录编号的帮助。 这是 ldif 文件,大小约为 2GB。处理机器是unix,所以我输入了awk。虽然已经尝试过 nl 和 cat,但它看起来更复杂,而 awk 看起来很适合这项任务,我对 sql 很熟悉,但这并不接近它:-)

目标是保证组和组元素的数值唯一性:

  1. 在数据组中以属性“dn:”开头的每一行添加具有重复编号的列(可以是重复的行号或计数器)重要的是它应该在组之间是唯一的。
  2. 属性重复时添加具有递增编号的列。

输入:

dn: uc=an
version: 12

dn: uid=fcb
uid: ljfhsfff
missdata: at12
missdata: at3
fladata: part2
fladata: part3
fladata: part1

dn: uid=fccb
uid: kjhfa8
missdata: at1
missdata: at8
missdata: at10
missdata: at14
fladata:: a06b6a==
fladata: part3
att: dsc

输出(可能之一):

1 1 dn: uc=an
1 1 version: 12

2 1 dn: uid=fcb
2 1 uid: ljfhsfff
2 1 missdata: at12
2 2 missdata: at3
2 1 fladata: part2
2 2 fladata: part3
2 3 fladata: part1

3 1 dn: uid=fccb
3 1 uid: kjhfa8
3 1 missdata: at1
3 2 missdata: at8
3 3 missdata: at10
3 4 missdata: at14
3 1 fladata:: a06b6a==
3 2 fladata: part3
3 1 att: dsc

【问题讨论】:

    标签: unix awk ldif


    【解决方案1】:
    $ awk -F':' '{if (NF) {$0 = (grpNr+1) OFS (++eltCnt[$1]) OFS $0} else {++grpNr; delete eltCnt}} 1' file
    1 1 dn: uc=an
    1 1 version: 12
    
    2 1 dn: uid=fcb
    2 1 uid: ljfhsfff
    2 1 missdata: at12
    2 2 missdata: at3
    2 1 fladata: part2
    2 2 fladata: part3
    2 3 fladata: part1
    
    3 1 dn: uid=fccb
    3 1 uid: kjhfa8
    3 1 missdata: at1
    3 2 missdata: at8
    3 3 missdata: at10
    3 4 missdata: at14
    3 1 fladata:: a06b6a==
    3 2 fladata: part3
    3 1 att: dsc
    

    【讨论】:

    • 之前看过你的回复 - 你是最棒的。它在 linux 中按预期工作,但是这是 solaris 所以猜测应该用 split("", array, ":") 替换 delete eltCnt 并且可能使用 nawk 对吗?
    • 在 Solaris 上,您应该使用 /usr/xpg4/bin/awk,而不是 nawk(POSIX 之前),绝对不是 /bin/awk(旧的、损坏的 awk)。是的,您可能需要use split("",eltCnt) 而不是delete eltCnt,但请先尝试后者。如果您确实使用了 split(),则不需要 3rg arg。
    • 再次感谢 Ed,我昨天找到了这个版本并实现了delete。同时我熟悉了 awk 并意识到我可以直接将数据从 ldif 转换为 csv。基于示例,我已经有了工作脚本,但不幸的是无法对具有相同名称的多个属性进行操作(如上)。我会尝试解决这个问题或提出新的问题,我已经完成了。
    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2017-12-06
    • 2016-07-30
    相关资源
    最近更新 更多