linux - 如何使用 sed 或 awk 正则表达式在 linux shell 中解析此数据

标签 linux shell sed awk

我的文件里有这些数据

 65 ---
 66 FieldType: Text
 67 FieldName: STATE
 68 FieldNameAlt: STATE
 69 FieldFlags: 4194304
 70 FieldJustification: Left
 71 FieldMaxLength: 2
 72 ---
 73 FieldType: Text
 74 FieldName: ZIP
 75 FieldNameAlt: ZIP
 76 FieldFlags: 0
 77 FieldJustification: Left
 78 ---
 79 FieldType: Signature
 80 FieldName: EMPLOYEE SIGNATURE
 81 FieldNameAlt: EMPLOYEE SIGNATURE
 82 FieldFlags: 0
 83 FieldJustification: Left
 84 ---
 85 FieldType: Text
 86 FieldName: Name_Last
 87 FieldNameAlt: LAST
 88 FieldFlags: 0
 89 FieldValue: Billa
 90 FieldJustification: Left
 91 ---

我怎样才能使它成为一个数组并将其作为键值对存储在数组中

array['fieldtype']
array['fieldName']

对于所有对象。

我认为分隔符只是“---”,但我不知道该怎么做

最佳答案

这是使用 GNU awk 的一种方法。它将输入拆分为记录,然后可以对其进行处理。

parse.awk

BEGIN {
  RS = " +[0-9]+ +---\n"
  FS = "\n"
}

{
  for(i=1; i<=NF; i++) {             # for each line
    sf = split($i, a, ":")
    if(sf > 1) {                     # only accept successfully split lines
      sub("^ +[0-9]+ +", "", a[1])   # trim key
      sub("^ +", "",  a[2])          # trim value
      array[a[1]] = a[2]             # save into array hash
    }
  }
}

{
  print "Record: " NR
  for(k in array) {
    print k " -> " array[k]
  }
  print ""
}

将上面的内容保存到 parse.awk 中并像这样运行它:

awk -f parse.awk infile

其中 infile 包含您要解析的数据。输出:

Record: 1

Record: 2
FieldFlags -> 4194304
FieldNameAlt -> STATE
FieldJustification -> Left
FieldType -> Text
FieldMaxLength -> 2
FieldName -> STATE

Record: 3
FieldFlags -> 0
FieldNameAlt -> ZIP
FieldJustification -> Left
FieldType -> Text
FieldMaxLength -> 2
FieldName -> ZIP

Record: 4
FieldFlags -> 0
FieldNameAlt -> EMPLOYEE SIGNATURE
FieldJustification -> Left
FieldType -> Signature
FieldMaxLength -> 2
FieldName -> EMPLOYEE SIGNATURE

Record: 5
FieldFlags -> 0
FieldNameAlt -> LAST
FieldJustification -> Left
FieldType -> Text
FieldMaxLength -> 2
FieldValue -> Billa
FieldName -> Name_Last

关于linux - 如何使用 sed 或 awk 正则表达式在 linux shell 中解析此数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13340277/

相关文章:

c - 如果已知 salt 和密码哈希,则暴力强制 crypt()?

Bash:在执行 bash 之前等待产生的子进程

linux - 使用 grep 和 sed 查找和替换字符串

assembly - 将 avr-asm 转换为 arm-gnu 注释的 sed 脚本

linux - 如何在 unix 中使用 less 命令在日志文件中搜索多个字符串?

linux - 为什么 "head -n"在通过管道传输到两个 echo 命令后不起作用?

linux - 从 Matlab 启动应用程序

linux - 我有两个日期,需要找出时间差

linux - 如何在Linux中删除目录中文件名的特定后缀

Sed - 如何匹配一个正则表达式组并用它来替换同一行中所有其他匹配的事件?