免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6422 | 回复: 14

[难题]awk不以引号内的空格作为FS [复制链接]

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-04-19 21:41 |显示全部楼层
本帖最后由 惟吾无为 于 2011-04-20 15:53 编辑

先上例子
# cat  a
"d f" "g g f"
df gdf
" h" "gv b"

执行命令
awk '{print $1}'

实际输出:
"d
df
"

期待输出
"d f"
df
" h"

d f
df
(空白)h

就是对于引号或其他字符引起来的分隔符, 不当做分隔符处理. "转义"了...
如何实现?
无法使用python, perl.
只有bash, awk, sed.

或者大家有什么程序可以的, 我尝试编译一下...

论坛徽章:
0
发表于 2011-04-19 22:32 |显示全部楼层
虽然你讲的比较拗口,不过应该算是看懂了……
但是总觉得 你说的要求 和 你的期待输出 非常矛盾……
按照你给的条件:
就是对于引号或其他字符引起来的分隔符, 不当做分隔符处理. "转义"了...


输出应该是如下两种才对:
"d f"
df
" h"
或者:
d f
df
(空白)h

但是我也不知道为什么像你说的那样,要么是你条件没描述清楚,要么是你自己的例子有问题……

你自己再琢磨一下?

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2011-04-19 22:53 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-04-20 00:06 |显示全部楼层
本帖最后由 yinyuemi 于 2011-04-20 01:18 编辑

回复 1# 惟吾无为

这样能行么?
  1. echo '"d f" "g g f"
  2. df gdf
  3. " h" "gv b"' |sed 's/" "/"\t"/g;/"/!s/ /\t/g' |awk -F'\t' '{print $1}'
  4. "d f"
  5. df
  6. " h"
复制代码
------------
改进一下,更通用些:
  1. awk -v p=1 '/\"/{p++}{printf p%2?$0"\t":$0" "}' RS=" " file |awk -F'\t' '{print $1}'
复制代码

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-04-20 07:17 |显示全部楼层
虽然你讲的比较拗口,不过应该算是看懂了……
但是总觉得 你说的要求 和 你的期待输出 非常矛盾……
按照 ...
xiaopan3322 发表于 2011-04-19 22:32


谢谢指正, 已经修改了.
抱歉.-_-!

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-04-20 07:37 |显示全部楼层
本帖最后由 惟吾无为 于 2011-04-20 07:40 编辑
回复  惟吾无为

这样能行么?------------
改进一下,更通用些:
yinyuemi 发表于 2011-04-20 00:06


awk -v p=1 '/\"/{p++}{printf p%2?$0"\t"0" "}' RS=" " file |awk -F'\t' '{print $1}'
只试了这个. 如果换成其他字符引起来的呢? 且非相同字符, 例如一对[].
这个原理好像是把非引用区的空格换成TAB.
能不能具体解释下'/\"/{p++}{printf p%2?$0"\t"0" "}', 或说个关键词, 我好找下.

awk -F'\t' '{print $1}'
换成
awk -F"\t" '{print $1}'
也没效.

最后我用
awk -F"$(printf "\t"" '{print $1}'
才行的, 难道是我的机器特殊?

对了, 这个TAB能不能换成其他字符, 例如\x1F等控制字符.
到时以这些控制字符为域分隔符?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-04-20 07:56 |显示全部楼层
回复 6# 惟吾无为
  1. awk -v p=1 ' #p变量初始为1
  2. /\"/{p++} # 每次匹配",p++
  3. {printf p%2?$0"\t":$0" "} # 如果p%2为1或0时,分别打印
  4. ' RS=" "  # 定义RS变量为空格,这个整个代码的关键。
  5. file
复制代码
只要是一对的符号应该是可以的,[和]
  1. echo '[d f] [g g f]
  2. df gdf
  3. [ h] [gv b]' |awk -v p=1 '/\[|\]/{p++}{printf p%2?$0"\t":$0" "}' RS=" " |awk -F'\t' '{print $1}'
  4. [d f]
  5. df
  6. [ h]
复制代码
另外,tab符可以改为其他符合,只要不影响将来的分析即可,如":","|"等都可以
  1. echo '[d f] [g g f]
  2. df gdf
  3. [ h] [gv b]' |awk -v p=1 '/\[|\]/{p++}{printf p%2?$0"|":$0" "}' RS=" " |awk -F'|' '{print $1}'
  4. [d f]
  5. df
  6. [ h]
复制代码

论坛徽章:
0
发表于 2011-04-20 08:03 |显示全部楼层
回复 1# 惟吾无为


    awk '/"/{split($0,m,"\"");print m[2];next}{print $1}' file

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-04-20 15:38 |显示全部楼层
回复  惟吾无为


    awk '/"/{split($0,m,"\"");print m[2];next}{print $1}' file
ywlscpl 发表于 2011-04-20 08:03


第三行拼到第二行后面了, 难道是第二行$1没有引号的缘故?

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-04-20 15:41 |显示全部楼层
好像的确如此, 而且出现"(空格)" "(空白)", 都会被过滤...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP