【问题标题】:How to use awk insert "." to string in the first column?如何使用 awk 插入“。”在第一列字符串?
【发布时间】:2014-06-10 16:18:27
【问题描述】:

我有一个包含一些数据的文件。 如何使用 awk insert . 在第一列插入字符串?

输入文件

MAC Address Inventory
MAC Address,IP Address
001a6b406ce8,172.18.1.1
001a6b50abdd,192.168.80.4
001a6b50f5e3,10.122.110.68
Total 3

输出文件

MAC Address Inventory
MAC Address,IP Address
001a.6b40.6ce8,172.18.1.1
001a.6b50.abdd,192.168.80.4
001a.6b50.f5e3,10.122.110.68
Total 3

【问题讨论】:

    标签: awk sh


    【解决方案1】:

    我知道你要求awk,但这对于sed 来说是很自然的:

    $ sed -r '/^[0-9a-f]+,/ s/^(.{4})(.{4})(.{4})/\1.\2.\3/g' infile
    MAC Address Inventory
    MAC Address,IP Address
    001a.6b40.6ce8,172.18.1.1
    001a.6b50.abdd,192.168.80.4
    001a.6b50.f5e3,10.122.110.68
    Total 3
    

    从您的示例看来,如果第一列包含 12 位十六进制数字,您似乎只想插入句点。所以,表达式/^[0-9a-f]{12},/ 告诉sed 只在第一列是这样一个十六进制数字的行上执行替换。替换然后抓取三组中的每一个,并在组之间放置一个句点。

    在 OSX 或其他非 GNU 系统下,将 sed -r 替换为 sed -E

    【讨论】:

      【解决方案2】:

      这里有一些使用awk的方法

      awk 'gsub(/\./,".")==3 {$0=substr($0,1,4)"."substr($0,5,4)"."substr($0,9)}1' file
      MAC Address Inventory
      MAC Address,IP Address
      001a.6b40.6ce8,172.18.1.1
      001a.6b50.abdd,192.168.80.4
      001a.6b50.f5e3,10.122.110.68
      Total 3
      

      awk -F\. 'NF==4 {$0=substr($0,1,4)"."substr($0,5,4)"."substr($0,9)}1' OFS=\. file
      

      【讨论】:

        【解决方案3】:
        awk '{ sub(/^[[:xdigit:]]{4}/, "\&.", $0)
               sub(/^[[:xdigit:]]{4}\.[[:xdigit:]]{4}/, "\&.", $0)
               print }' input.file
        

        有效;可能有更优雅的方式来做到这一点。

        【讨论】:

        • 要在awk 中使用间隔{4},您需要gnu awk 4.0 或更高版本。如果您有旧版本,请使用awk --re-interval 'code'
        • @Jotne:我实际上在 Mac OS X 10.9.2 上使用 BSD awk (20070501) 对其进行了测试。但是,我的机器上也有gawk 3.1.7,但它不能与它一起工作——我觉得这很奇怪(无论如何都出乎意料)。 GNU awk 也抱怨与符号前的反斜杠,但由于它不匹配,所以没有太大区别。去掉反斜杠更符合 POSIX。
        猜你喜欢
        • 1970-01-01
        • 2015-01-26
        • 1970-01-01
        • 2021-07-28
        • 2013-05-03
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多