Parsing awk解析文件并导出为变量

Parsing awk解析文件并导出为变量,parsing,variables,awk,Parsing,Variables,Awk,我正在分析一个文本文件 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

我正在分析一个文本文件

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
我收到订单

TLines=00092,00093, TGEN=0,0, TLink=TEST1_1519230912,TEST2_1619330534,
我有两个问题。 首先,我不明白为什么TGN的值在输出“0,0”中被打印两次。如果文件中的字段值重复,我只希望o/p中有一个值。

其次,我将这些o/p重定向到另一个文件中,并使用#source filename.txt命令将这些值设置为环境变量,并在脚本的后面部分使用它们。是否有更好的方法将它们用作脚本中的变量,而不是创建另一个文件并将其来源。

使用中的
查看是否重复某个值,以避免该值本身计算为false的情况。这就是
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,
编辑

在上面,我保持了与您的原始版本相近的内容,但正如评论中所提到的,一个更惯用、更好的版本应该是:

 $ 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代码):


中使用
,查看是否重复某个值,以避免该值本身的计算结果为false。这就是
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,
编辑

在上面,我保持了与您的原始版本相近的内容,但正如评论中所提到的,一个更惯用、更好的版本应该是:

 $ 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代码):


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