如何使用 awk 从 grep 打印选定的列
How to print selected columns from grep using awk
我有以下输入,
[2014-12-22 10:39:54,668] - 1=1,2=2,3=A,4=1,109=5313F,110=Y,112=20141222-15:40:21.056,150=D,180=C,167=CS
各行的字段顺序可能不同。
目标是获取特定字段,例如日期、时间、109、110、150、167 等
2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS.
困难在于不同行的字段顺序可能不同,关于实现此目的的简单 awk 脚本的任何建议还是 perl/python 更适合?
这可能会:
awk -F"[][, ]" '{a=","",";for (i=5;i<=NF;i++) if($i~/^1(09|10|50|67)=/) a=a","$i;print a}' file
2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS
Awk 支持 associative arrays。这可以帮助您克服字段排序问题,如下所示:
echo "[2014-12-22 10:39:54,668] - 1=1,2=2,3=A,4=1,109=5313F,110=Y,112=20141222-15:40:21.056,150=D,180=C,167=CS" |
awk -F'[, \[\]]' '{
for (i=7; i++ < NF;)
{
split($i,parts,"=");
h[parts[1]]=parts[2]
}
printf "%s,%s,%s,109=%s,110=%s,150=%s,167=%s\n ",
, , ,
h["109"],
h["110"],
h["150"],
h["167"]
}'
每当您的输入中有 name=value
对时,最好创建一个 name2value 数组然后使用它:
$ cat tst.awk
BEGIN { FS="[][ ,=]"; OFS="," }
{
for (i=7; i<=NF; i+=2) {
name2value[$i] = $(i+1)
}
print , , , fmt(109), fmt(110), fmt(150), fmt(167)
}
function fmt(name) { return (name "=" name2value[name]) }
$ awk -f tst.awk file
2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS
我有以下输入,
[2014-12-22 10:39:54,668] - 1=1,2=2,3=A,4=1,109=5313F,110=Y,112=20141222-15:40:21.056,150=D,180=C,167=CS
各行的字段顺序可能不同。
目标是获取特定字段,例如日期、时间、109、110、150、167 等
2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS.
困难在于不同行的字段顺序可能不同,关于实现此目的的简单 awk 脚本的任何建议还是 perl/python 更适合?
这可能会:
awk -F"[][, ]" '{a=","",";for (i=5;i<=NF;i++) if($i~/^1(09|10|50|67)=/) a=a","$i;print a}' file
2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS
Awk 支持 associative arrays。这可以帮助您克服字段排序问题,如下所示:
echo "[2014-12-22 10:39:54,668] - 1=1,2=2,3=A,4=1,109=5313F,110=Y,112=20141222-15:40:21.056,150=D,180=C,167=CS" |
awk -F'[, \[\]]' '{
for (i=7; i++ < NF;)
{
split($i,parts,"=");
h[parts[1]]=parts[2]
}
printf "%s,%s,%s,109=%s,110=%s,150=%s,167=%s\n ",
, , ,
h["109"],
h["110"],
h["150"],
h["167"]
}'
每当您的输入中有 name=value
对时,最好创建一个 name2value 数组然后使用它:
$ cat tst.awk
BEGIN { FS="[][ ,=]"; OFS="," }
{
for (i=7; i<=NF; i+=2) {
name2value[$i] = $(i+1)
}
print , , , fmt(109), fmt(110), fmt(150), fmt(167)
}
function fmt(name) { return (name "=" name2value[name]) }
$ awk -f tst.awk file
2014-12-22,10:39:54,668,109=5313F,110=Y,150=D,167=CS