【问题标题】:How to check if a field contains round braces?如何检查字段是否包含圆括号?
【发布时间】:2013-04-25 18:29:25
【问题描述】:

我有一个非常大的平面文件列表,我已经能够使用 awk 的新手知识对其进行解析,但是当我的字段没有被空格分隔并且不是很统一时,我会遇到一些学习曲线。我的样本数据如下:

AAA 10(05/12)(06:59) BBB
CCC 12       (12:24) DDD
EEE 10 04:39 (02:10) FFF
GGG 13 12/09  03:52  HHH

我想从第 3 列中解析出字段,但前提是它们不为空白也不被括号括起来。所以我应该有 4 行的输出,2 个空白和 2 个填充数据:

*blank*
*blank*
04:39
12/09

到目前为止我尝试过的是:

my loop:
dtime=substr($0,7,7)
if (match(dtime,"(\\(.*\\))")==1) {
    dtime=""
}
print dtime

有没有更有效的方法来做到这一点?

【问题讨论】:

  • 如果你不想要它们为什么输出包含空白。
  • 我不确定如何在此站点上显示“空白行”。基本上我的输出,当找到空白时,会返回一个 7 字符的空白字符串。
  • 想要那些空白行吗?

标签: shell unix awk


【解决方案1】:

试试 gawk FIELDWIDTHS 变量:

# AAA 10(05/12)(06:59) BBB
# .3.1.21.5...11..5..11.3.
$ gawk -vFIELDWIDTHS='3 1 2 1 5 1 1 5 1 1 3' '{if($4=="(" && $6==")")print ""; else print $5}' input 


04:39
12/09

【讨论】:

  • 这也是我的第一个想法,但遗憾的是我们客户的机器(运行此脚本的地方)没有可用的 gawk。只是 awk。
  • 您可以先运行sed将其转换为csv文件。
【解决方案2】:

使用 sed:

sed -e 's/[^ ]* *[^( ]*//'                          \
    -e 's/[(]*[0-9][0-9]:[0-9][0-9][)]* *...$//'    \
    -e 's/(.*)//' input

【讨论】:

  • 谢谢!我会试试这个。
【解决方案3】:

这可能对你有用:

$ awk 'NF==5{print $3;next}{print "*blank*"}' file
*blank*
*blank*
04:39
12/09

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 2021-09-15
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多