awk - 为每一行提取正则表达式模式 - 如果不存在模式,则留空行
问题描述
我正在使用以下输入:
"visit_date":{"$date":"2017-11-28T04:43:00.000Z"},"phone":"549-287-5287","city":"Marshall","gender":"female","email":"mortina.curabia@gmail.com"
我需要能够将每行的电话号码和电子邮件提取到单独的文件中。然而,这两个值并不总是出现在同一个字段中——它们总是以“电话”:或“电子邮件”:开头,但它们可能出现在第一个、第二个、第三个甚至第二十个字段中。
我曾尝试将 SED 和 AWK 中的解决方案组合在一起,以删除所有内容,直到“电话”,然后每隔一个,但这并不能按预期工作。这也意味着,如果“电话”和/或“电子邮件”不存在,则线路根本不会改变。
我需要一个解决方案,它会给我一个文件中每一行的电话值和另一个文件中的电子邮件值的输出。但是,如果不存在电话或电子邮件值,则需要在输出中放置一个空白行。
有任何想法吗?
解决方案
这可能对您有用(GNU sed):
sed -Ene 'h;/.*"phone":([^,]*).*/!z;s//\1/;w phoneFile' -e 'g;/.*"email":([^,]*).*/!z;s//\1/;w emailFile' file
复制行。
如果该行不包含电话号码,则清空该行,否则删除除电话号码之外的所有内容。
将结果写入电话号码文件。
用原始行的副本替换当前模式空间。
对电子邮件地址重复上述操作。
注意我第一次尝试使用s/.*//
而不是z
清空有效但不应该有的行。如果该行不包含电话/电子邮件,则替换应该重置默认正则表达式,并且第二个替换应该反对它不包含反向引用。然而,第二次替换在任何一种情况下都有效。
推荐阅读
- xamarin - Xamarin 视频播放器无法播放模拟器文档文件夹中的视频
- arduino - 在 Arduino Micro 上,什么引脚用于在启动时闪烁 LED
- google-cloud-speech - Google 的语音 API 可以接受外部视频 URL 吗?
- r - 当数据框的行中有某个字符时如何插入给定的描述
- hyperlink - 使用脚本复制行时保留超链接
- excel - 尝试浏览文件夹中的所有 XLSX 文件,取消保护,更改值并保护它们
- php - 将 CSV 文件导入 Sqlite3 数据库时删除无效字符的 sed 命令
- java - 运行 Kafka 2.11-2.3.0 的问题
- javascript - 如何检查一个数组是否包含另一个数组的任何项
- r - 如何将数据框转换为 R 中的对称矩阵?