标签为 awk 的文章

通过一道奇葩面试题来体验下awk的强大

面试题内容
需求:以"|"为分隔符,打印第一字段第一个字符是1,第二个字段第二个字符是2,第三个字段第三个字符是3,以此类推;倒数第二个字段前8个字符是当天日期如“20140610”。

源文件raw_data.txt:

$ date +%Y%m%d

我用Python实现的代码:
$ ./check_string.py

#!/usr/bin/env python

import datetime

def check_item(string):
    item_list = string.split('|')
    for item_id in range(0,len(item_list)):
        try:
            item_sub_list = list(item_list[item_id])
        except IndexError:
            return False

        special_item_id = len(item_list) - 2
        expect_item_sub_value = item_id + 1
        if item_id != special_item_id:
            try:
                if not item_sub_list[item_id] != expect_item_sub_value:
                    return False
            except IndexError:
                return False
        else:
            if not datetime.datetime.now().strftime("%Y%m%d") == ''.join(item_sub_list[0:8]):
                return False

    return True

if __name__=='__main__':
    filename = 'raw_data.txt'

    with open(filename) as fp:
        for line in fp:
            if check_item(line.replace('\n','')):
                print "Matched: {0}".format(line.replace('\n',''))

网友“运维@苏东”用awk实现的代码:
$ cat raw_data.txt | awk -F\| 'BEGIN{d=strftime("%Y%m%d")} { i=1;j=NF-1;k=0;while(i<j-1){if ( substr($i,i,1) == i ){k++;}; i++}; if (k==i-1 && substr($j,1,8) == d && substr($NF,NF,1) == NF) {print $0} }'

,

2 Comments