我有一个脚本从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, ,
哪个更好,但有些胡言乱语,我不太明白..
答案 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/'