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

find integer from Nth field in awk

我有一个脚本可以将 Twitter 的流 API 输出成这样的格式

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

其中字段 3 是实际推文。

我想做的是从该字段中获取整数并将其作为单独的 field/column.

插入到数据库中

只插入这些字段不是问题,但获取 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(,s," "); for (i=1;i<=n;i++) if
(s[i] + 0 == s[i]) int_val = s[i]}{print "\"""\","", \"""\",
"int_val", "", "}')
-bash: syntax error near unexpected token `)'

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

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

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

哪个更好,但是有点乱,我不太明白..

我不确定我是否完全理解你想要什么,但我猜你想提取(或去除)第三个字段的 int 值,对吗?

这样做:

awk -F"|" '{print }' 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(,s," "); for (i=1;i<=n;i++) if (s[i] + 0 == s[i]) int_val = s[i]}{print "\"""\","", \"""\", "int_val", "", "}' 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

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

我正在使用 bashism 将数据提供给 awk,您可以使用其他东西:

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

这只是对管道周围的 "trim" 数据做了一些替换,然后删除第一个 space 之后的所有内容。

如果您需要帮助将此数字插入数据库,则必须更明确地说明您使用的是什么工具。例如,这可能有效:

$ n=$(awk -F'|' '{n=;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=; sub(/^ */,"",n); sub(/ .*/,"",n);
    printf(fmt,n);
  }' input.txt \
| psql