从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
我有一个脚本可以将 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