找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 16398|回复: 4

[问题求助] 求awk分隔符写法

[复制链接]
发表于 2022-9-20 16:52:38 | 显示全部楼层 |阅读模式
有如下记录

  1. "f ield1 - fi eld2""fie ld3" "fiel d4" "field 5"
复制代码
每1个记录内有

  1. ["]、[ - ]、[""]、[" "]
复制代码
等4种分隔符(不含方括号[]),使用次序随机,现用awk进制分割,想要得到

  1. $1=f ield1
  2. $2=fi eld2
  3. $3=fie ld3
  4. $4=fiel d4
  5. $5=field 5
复制代码
以下指令(在Windows下测试)分隔符(-F"????")该如何写,才能得到想要的结果

  1. echo "f ield1 - fi eld2""fie ld3" "fiel d4" "field 5"|awk  -F"????" "{print $1,$2,$3,$4,$5}"
复制代码
感谢各位大神的教导,谢谢
发表于 2022-9-20 17:11:54 | 显示全部楼层
回复 1# hfxiang


这个不是单纯设置列分隔符能解决的。
首先会遇到的问题就是双引号作为列分隔符之一的话,某些列是空值,跟你希望的结果不一样。
设置多个列分隔符在语法上是这样的:
echo "f ield1 - fi eld2""fie ld3" "fiel d4" "field 5" | gawk -F "[-\"]+" "{print $2; print $3; print $4; print $6; print $8}"
 楼主| 发表于 2022-9-21 08:03:26 | 显示全部楼层
回复 2# Batcher


是的,谢谢。
(-F "[-\"]+") 的确不是俺想要的结果
 楼主| 发表于 2023-2-26 09:27:23 | 显示全部楼层
目前找到最接近的方法是在-F后的分隔符表达式用其字符对应的八进制替代(空格\040、双引号\042、减号\055),具体如下:

  1. echo "f ield1 - fi eld2""fie ld3" "fiel d4" "field 5"|awk -F"\042|\040\055\040|\042\042|\042\040\042" "{for(i=0;++i<NF;)print "$"i"="$i}"
  2. 输出:
  3. $1=
  4. $2=f ield1
  5. $3=fi eld2
  6. $4=fie ld3
  7. $5=fiel d4
  8. $6=field 5
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:30 , Processed in 0.009099 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表