在awk中找到第N个字段的整数

时间:2015-02-23 15:14:21

标签: regex parsing awk

我有一个脚本从Twitter的流API生成输出到这样的格式

semmelracet_dev | 450587667 | 1 semla till idag! #semmelreport | 569866960802062336 | 1424701845728

字段3是实际的推文。

我想要做的是从该字段中获取整数并将其作为单独的字段/列插入数据库。

要插入这些字段不是问题,但获取INT并单独处理它是。我可以强制使用并在INT之后拆分字段吗?

很抱歉不包括已取消的输出。基本上我正在构建像

这样的mysql插件
"... insert into report values ("semmelracet_dev", 450587667, "1 semla till idag! #semmelreport", 1, 569866960802062336, 1424701845728)"

有什么想法吗?

再次编辑,或者如果它是不可行的,可能保留所有列,并且在字段3中只是在将它们插入数据库时​​保留int?

编辑2

尝试了以下jeanrjc的解决方案并取得了成功

cat tweetReport.txt | awk -F"\|" '{n=split($3,s," "); for (i=1;i<=n;i++) if
(s[i] + 0 == s[i]) int_val = s[i]}{print "\""$1"\","$2", \""$3"\",
"int_val", "$4", "$5}')
-bash: syntax error near unexpected token `)'

然后我删除了尾随)并得到了

cat tweetReport.txt | awk -F"\|" '{n=split($3,s," "); for (i=1;i<=n;i++) if     
(s[i] + 0 == s[i]) int_val = s[i]}{print "\""$1"\","$2", \""$3"\",
"int_val", "$4", "$5}'

awk: warning: escape sequence `\|' treated as plain `|'
"semmelracet_dev ", 450587667 , " 1 semla till idag! #semmelreport ", 1,
569866960802062336 ,  1424701845728 "",, "", 1, ,

哪个更好,但有些胡言乱语,我不太明白..

3 个答案:

答案 0 :(得分:1)

我不确定我完全明白你想要什么,但我猜你想提取(或摆脱)第3个字段的int值,是吗?

这样做:

awk -F"|" '{print $3}' file | awk '{for (i=1; i<=NF; i++) if ($i + 0 == $i) print $i}'

其中($i + 0 == $i)测试这个单词是否为int,然后打印出来。

我希望通过这种方式,你能够得到你想要的东西。否则,精确到您的预期输出。

编辑:获得所需的输出:

$ cat tweet.txt
semmelracet_dev | 999999999 | 2 foo  bar! #fooreport | 999996696080209999 | 1429999845728
semmelracet_dev | 450587667 | 1 semla till idag! #semmelreport | 569866960802062336 | 1424701845728


$ awk -F"\|" '{n=split($3,s," "); for (i=1;i<=n;i++) if (s[i] + 0 == s[i]) int_val = s[i]}{print "\""$1"\","$2", \""$3"\", "int_val", "$4", "$5}' tweet.txt 

"semmelracet_dev ", 999999999 , " 2 foo  bar! #fooreport ", 2,  999996696080209999 ,  1429999845728
"semmelracet_dev ", 450587667 , " 1 semla till idag! #semmelreport ", 1,  569866960802062336 ,  1424701845728

您可以在变量中捕获,然后传递它以构建您的mysql插入。

HTH

答案 1 :(得分:1)

我使用bashism将数据提供给awk,你可以使用别的东西:

$ t="semmelracet_dev | 450587667 | 1 semla till idag! #semmelreport | 569866960802062336 | 1424701845728"
$ awk -F'|' '{n=$3;sub(/^ */,"",n);sub(/ .*/,"",n);print n;}' <<<"$t"
1

这只是对&#34; trim&#34;进行了几次替换。管道周围的数据,然后在第一个空格后删除任何内容。

如果您希望帮助将此数字插入数据库,您必须更明确地了解您正在使用的工具。例如,这可能有效:

$ n=$(awk -F'|' '{n=$3;sub(/^ */,"",n);sub(/ .*/,"",n);print n;}' <<<"$t")
$ psql -c $(printf 'INSERT INTO table (n) VALUES (%d);' "$n")

或者,如果您更喜欢从日志文件中获取这些数据并通过psql管道,您可以这样做:

awk -F'|' -vfmt="INSERT INTO table (n) VALUES (%d);" '
  {
    n=$3; sub(/^ */,"",n); sub(/ .*/,"",n);
    printf(fmt,n);
  }' input.txt \
| psql

答案 2 :(得分:0)

awk 'BEGIN{FS="|";} {print($3);}' | sed -r 's/([0-9]+)(.*)/\1/'