我正在解析文本文件
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 :(得分:2)
使用in
查看是否重复了某个值,以避免值本身的计算结果为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代码):
$ eval "$(awk -f a.awk f)"
$ echo $TLines
00092,00093,
$ echo $TGEN
0,
$ echo $TLink
TEST1_1519230912,TEST2_1619330534,