【问题标题】:awk to parse file and export as variableawk 解析文件并导出为变量
【发布时间】:2018-08-01 14:37:49
【问题描述】:

我正在解析一个文本文件

Lines   File Name           Gen LnkLN LINK   Time
----- -------------------- ---- -----  ---- ------------------------
00090 TEST1_1519230912        0 00092 .X.X Wed Feb 21 16:35:14 2018
00091 TEST2_1619330534        0 00093 .X.X Wed Feb 21 16:35:14 2018

使用代码

awk '{if (($1 ~ /^[0-9A-Fa-f]+$/) && (length($1)==5)) {
    if (! c[$4]) TLN=TLN $4 ","
    c[$4]=$4;
    if (! d[$3]) TGN=TGN $3 ","
    d[$3]=$3
    if (! b[$2]) TLNK=TLNK $2 ","
    b[$2]=$2
    } 
} END {print "TLines="TLN,"TGEN="TGN,"TLink="TLNK}' /var/tmp/slink.jnk

我得到 O/p

TLines=00092,00093, TGEN=0,0, TLink=TEST1_1519230912,TEST2_1619330534,

我有两个问题。 第一个是我不明白为什么 TGN 的值在输出“0,0”中被打印两次。如果文件具有字段的重复值,我只希望 o/p 中有一个值。
其次,我将这些 o/p 重定向到另一个文件并使用 #source filename.txt 命令将这些值设置为环境变量,并在脚本的后面部分使用它们。有没有更好的方法将它们用作脚本中的变量,而不是创建另一个文件并获取它。

【问题讨论】:

  • 我的输入文件没有正确显示
  • 您获得两个0 值的原因是即使您设置了d[0] = 0(! d[0]) 仍然为真。请改用if (!($3 in d))

标签: parsing variables awk


【解决方案1】:

使用in 查看一个值是否被重复以避免值本身评估为假的情况。这就是您的 0 值发生的情况,以及它在您的输出中重复出现的原因。

$ awk '{if (($1 ~ /^[0-9A-Fa-f]+$/) && (length($1)==5)) {
          if (!($4 in c)) TLN=TLN $4 ","
          c[$4]
          if (!($3 in d)) TGN=TGN $3 ","
          d[$3]
          if (!($2 in b)) TLNK=TLNK $2 ","
          b[$2]
        } 
      } END {print "TLines="TLN,"TGEN="TGN,"TLink="TLNK}' f

输出:

TLines=00092,00093, TGEN=0, TLink=TEST1_1519230912,TEST2_1619330534,

编辑

上面我的内容与您的原始版本接近,但正如 cmets 中所述,更惯用和更好的版本将是:

 $ awk '($1 ~ /^[0-9A-Fa-f]+$/) && (length($1)==5) {
      if (!c[$4]++) TLN=TLN $4 ","
      if (!d[$3]++) TGN=TGN $3 ","
      if (!b[$2]++) TLNK=TLNK $2 ","
  } END {print "TLines="TLN,"TGEN="TGN,"TLink="TLNK}' f

结束编辑

对于设置变量,这对我有用(上面的 a.awk 包含 awk 代码):

$ eval "$(awk -f a.awk f)"
$ echo $TLines
00092,00093,
$ echo $TGEN
0,
$ echo $TLink
TEST1_1519230912,TEST2_1619330534,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2018-04-25
    • 2014-04-05
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2016-05-04
    相关资源
    最近更新 更多