awk - 如何用引号分隔单词
问题描述
我正在研究汽车数据集;汽车品牌和型号显示在如下字符串中。你可以假设模型只有一个词。
"Honda civic LX"
"audi 500s (diesel)"
"toyota camry"
"ford ranger"
我想要的输出是将 make (包含在一个单词中)用单引号括起来,而 model 和 trim 用它们自己的单引号括起来,如下所示:
'honda' 'civic LX'
'audi' '500s (diesel)'
'toyota' 'camry'
'ford' 'ranger'
我还应该注意我使用的数据集是这样组织的。
28.0 4 119 82.0 2720 99 1 "audi 500s (diesel)"
23.5 4 225 76.0 5530 81 1 "toyota camry"
我想用 SED 解决它,我接近通过以下命令解决它。
sed "s/\"/'/g;s/ /' '/"
但是,这使我的数据集如下所示。你可以看到它在第一列的末尾添加了一个'',这不是我想要的。另外,我认为该命令会分开品牌和型号,但事实并非如此。
28.0' ' 4 119 82.0 2720 99 1 'audi 500s (diesel)'
23.5' ' 4 225 76.0 5530 81 1 'toyota camry'
解决方案
希望这有效。
sed "s/\"/'/g"| sed -E "s/([a-z])( )/\1' '/"
解释
第一部分(或“查找”部分)([a-z])( )
查找出现的小写字母,后跟空格,分成 2 组,用 . 表示()
。所以,第一组是字母([a-z])
,第二组是空格( )
。
在第二部分(或替换部分)\1' '
中,\1
表示找到的第一组(这是反向引用,要使其正常工作,-E 标志是必不可少的)。如果我们不这样做,字母表和空格都将被替换为' '
,因此我们将丢失最后一个字母表,这将导致类似aud' '500s (diesel)'
. 为了保留最后一个字母,我必须这样做。
推荐阅读
- react-native - 在 react-native-scratch 中完成从头开始
- reactjs - 为什么使用变量命名 react-final-form 组件会导致无限循环?
- javascript - 如何让我的输入值出现在我的所有 html 页面中?
- python - 在 Python 中重新引发相同错误的最佳实践
- python-3.x - 网络抓取问题 - 某些字符无法解码,并被替换为 REPLACEMENT CHARACTER
- vue.js - vuejs 应用程序的 Nginx 路径重写在浏览器中未按预期工作
- python-3.x - 如果它是类属性,我如何以自我身份访问此电子邮件属性?
- django - Get_next_by_FOO 方法错误地返回链接
- ruby-on-rails - 如何使用 post fetch 请求将反应对象发送到 rails api?406 错误
- django - 如何在视图 Django 中接收 AJAX POST 数据?